C++でスレッド処理(並行処理)の限界は、
CPUのスレッド数(論理コア数)をこえることはできないもしくは超えると処理が著しく低下ということでしょうか?
タスクマネージャーにスレッド数2000という記載があり(前後差あり)
C++の並行処理はどこのスレッドを使っているのかわからず質問させていただきました
よろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/01/14 03:57
回答6件
0
マルチスレッドの方式にも色々とありますが、 std::thread
が想定するような仕組みはいわゆるプリエンプティブ・マルチタスクです。 計算能力を時間で分割して次々と切り替えながら計算することであたかも同時に計算しているかのように処理します。
これが有効なのは、複数のプログラムが稼働していても実際の計算がそれほど多くないからです。 たとえばあなたのパソコン上でブラウザとエディタを同時に起動していて、資料を見つつエディタでプログラムを書いていたとしましょう。 エディタでプログラムを書いている間はブラウザはほとんど何もしてないですよ。
これが高度な動画処理だとか機械学習とかのように時間あたりの計算がみっちりつまった処理ならコアの数を超えて分割しても効率は上がりません。
投稿2021/01/14 04:41
総合スコア5684
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
「ハードウェアが提供するスレッド(論理コア)」「OSが提供するスレッド」「std::thread
が提供するスレッド」というレベルがあり、それぞれがどういう対応をしているかは環境依存・実装依存の話です。std::thread
がOSが提供するスレッドに1:1で対応するケースが多いでしょうが、ユーザランドスレッドで実装されている場合もありえます。
(追記: C++の規格書を読んだら、「std::thread
はOSのスレッドに1:1対応することを意図している」というようなことが書いてありました。が、そうでない実装も規格違反ではないでしょう。)
CPUのスレッド数(論理コア数)をこえることはできないもしくは超えると処理が著しく低下ということでしょうか?
環境依存です。スレッドのタイムシェアリングするようなOSではスレッド数が著しく増えてもトータルの実行時間はコンテキストスイッチのコストぶんしか遅くならないでしょう。
タスクマネージャーにスレッド数2000という記載
OS上でたくさんのスレッドが動いていても、ほとんどのスレッドはI/O待ちやイベント待ちで止まっていると思います。
投稿2021/01/14 04:36
編集2021/01/14 04:59総合スコア21679
0
スレッドはいくつでも起こせます、たとえコアがたった一個でも。
動けるスレッド数 > コア数 の時は複数のスレッドが(短い間隔で)コアを譲り合う(奪い合う?)ことで
同時に動いているように見せかけますから。
タスクマネージャーにスレッド数2000という記載があり
例えば入力を待ってるスレッドの類は"寝てます"。
寝てるスレッドならいくらあってもコアを消費しません。
同時に動いているスレッド数は最大でもコア数を超えませんけどね。
投稿2021/01/14 04:28
編集2021/01/14 04:32総合スコア16612
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
過去に並行・並列処理について回答しているのでこちらも合わせてお読みください(ついでに並行処理と並列処理の区別がついてくれるといいな)。
C++ - マルチスレッドでCPUのコア/スレッド数を超えたスレッドを指定するということはどういうこと?|teratail
投稿2021/01/14 07:56
総合スコア2853
0
プロセッサのマルチスレッディングという機能と、OSのスレッドは同じような名前が付いていますが,別のものです。
C/C++やその他の言語でスレッドと呼んでいるものはOSのthreadあるいはlight-weight processという機能です。
プロセスとスレッドの大きな違いは、プロセスは個別に仮想空間を持っているものであり、そのプロセスの中で仮想レジスタセットを持っているのがスレッドです。
プロセスが生成されたときには、当然一個のスレッドがあり、これがOSに頼んで(つまりシステムコールをして)他のスレッドを作り出します。
CPUは演算器、レジスタ、キャッシュ、メモリアクセスなどの資源を持っています。そして、これらの資源を有効に利用するために、機械命令をマイクロ命令に分解して実行し、さらに順序を無視した実行(out-of-0order)とか、キャッシュの先読みなどの機能を持っています。インテルチップでいうと、224エントリーのアウトオブオーダーバッファを持ち、同時に6マイクロ命令を発行できる機能、キャッシュアクセスのための4本のパイプ等をもっています。最近の最適化コンパイラはそのような機能を使って資源の利用効率を上げる、つまり高速に実行しようとしますが、CPUのクロックに比べて、メモリアクセス速度が非常に遅いなどの問題で、どうしても待ちが発生します。
OSはプロセスを使って、個々のソフトの高速化ではなく、システム全体の資源利用効率を良くすること、つまりスループット向上を行います。
一方、スレッド実行を行うと、仮想的なレジスタを使うことで、同一アプリの速度向上が起こる可能性があります。ただし、スレッドを作るときと消すときにはかなりのオーバーヘッドがかかりますので、なんでもマルチスレッドにすればよいというものではありません。
ハードウェアのマルチスレッディングは、演算器やメモリパイプなどの資源の利用効率を上げるために、ハード的なレジスタセットを複数持つというハードウェアアーキテクチャです。
従って1コアあたりの資源が同じであれば、2コアでマルチスレッディングなしのCPUと2コアで4スレッディングのCPUで4スレッドのアプリを動かすと、多少は後者が速いのですが、思ったほど違いは出ません。
それに比べると、2コアでマルチスレッディングなしのCPUの方がずっと速くなります。
例で説明します。
モスバーガーのキッチンに、オーブンとか、トースターとかフライヤーとかいろいろな資源がありますね。
あるお客さんのオーダーを順番にやってそれが終わってから次のお客さんのオーダーを始めたのでは、効率が悪いのです。そこで、オーダー分けて、商品一個づつの作業表を作ります。これを作業表置き場に置いておいて、1個目のハンバーガーのパティを焼き始めてまた作業表置き場に起きます。その間にエビバーガーのフライを揚げ始めます。
スレッドとはこの作業表であり、それが置かれている作業表置き場がOSのスレッド管理機能です。
スレッドが3000個あっても、そのうちである瞬間に実行しているのは少数なのです。ほとんどのスレッドは作業表置き場に置かれて、実行されるのを待っています。
ハードウェアのマルチスレッディングというのは、キッチンの機器の数は変わらないけれども、スタッフの人数が倍いるので、ちょっと効率が高いというゆな意味です。
投稿2021/01/14 09:45
編集2021/01/14 10:37総合スコア24670
0
結末からいえば、OSが管理しています。
スレッドの理解のため、まずはプロセスから理解しましょう。
プロセスとは、プログラム(ソフトウェア)を動作させるための論理的計算資源の集合体です。
例えば、一台のWindowsPC上で複数のソフトを同時利用することがあります。このとき、OSはそれぞれのソフトに独立した計算資源を割り当てます。これがプロセスです。具体的には計算装置(論理CPU)と記憶領域(論理メモリ)が割り当てられます。
この論理CPUがスレッドの正体です。論理的なものなので、複数存在することもあります。並列処理はマルチプロセスかマルチスレッドの2通りの手段があります。特に、論理メモリを共有する場合はマルチスレッドが適切です。
投稿2021/01/14 07:47
総合スコア4830
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。