🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
並列処理

複数の計算が同時に実行される手法

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

6回答

6004閲覧

C++のスレッド処理はどこでおこなっているのか?

apa

総合スコア68

並列処理

複数の計算が同時に実行される手法

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

2クリップ

投稿2021/01/14 03:47

C++でスレッド処理(並行処理)の限界は、
CPUのスレッド数(論理コア数)をこえることはできないもしくは超えると処理が著しく低下ということでしょうか?

タスクマネージャーにスレッド数2000という記載があり(前後差あり)
C++の並行処理はどこのスレッドを使っているのかわからず質問させていただきました
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

int32_t

2021/01/14 03:56

「C++のスレッド」とは std::thread のことを指してますか?
apa

2021/01/14 03:57

わかりずらくてすいません std::threadです
guest

回答6

0

マルチスレッドの方式にも色々とありますが、 std::thread が想定するような仕組みはいわゆるプリエンプティブ・マルチタスクです。 計算能力を時間で分割して次々と切り替えながら計算することであたかも同時に計算しているかのように処理します。

これが有効なのは、複数のプログラムが稼働していても実際の計算がそれほど多くないからです。 たとえばあなたのパソコン上でブラウザとエディタを同時に起動していて、資料を見つつエディタでプログラムを書いていたとしましょう。 エディタでプログラムを書いている間はブラウザはほとんど何もしてないですよ。

これが高度な動画処理だとか機械学習とかのように時間あたりの計算がみっちりつまった処理ならコアの数を超えて分割しても効率は上がりません。

投稿2021/01/14 04:41

SaitoAtsushi

総合スコア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
int32_t

総合スコア21679

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

apa

2021/01/14 12:11

返信ありがとうございます ハードウェアが提供するスレッドが論理プロセッサ数(タスクマネージャーのパフォーマンスの論理プロセッサ数)で OSが提供するスレッドは上限が記されていない = std::threadも上限は指定されていない という認識でよろしいでしょうか?
guest

0

スレッドはいくつでも起こせます、たとえコアがたった一個でも。

動けるスレッド数 > コア数 の時は複数のスレッドが(短い間隔で)コアを譲り合う(奪い合う?)ことで
同時に動いているように見せかけますから。

タスクマネージャーにスレッド数2000という記載があり

例えば入力を待ってるスレッドの類は"寝てます"。
寝てるスレッドならいくらあってもコアを消費しません。
同時に動いているスレッド数は最大でもコア数を超えませんけどね。

投稿2021/01/14 04:28

編集2021/01/14 04:32
episteme

総合スコア16612

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

過去に並行・並列処理について回答しているのでこちらも合わせてお読みください(ついでに並行処理と並列処理の区別がついてくれるといいな)。
C++ - マルチスレッドでCPUのコア/スレッド数を超えたスレッドを指定するということはどういうこと?|teratail

投稿2021/01/14 07:56

A_kirisaki

総合スコア2853

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

apa

2021/02/01 13:54

勉強不足だったのでいろいろ 調べていたのですが、 マルチスレッドが並行処理を踏まえて 自分のゲームで下記を試しました マルチスレッド開始 for() { ①とんでもなく重い処理(実際にはメッシュの読み込み) } while() { ②//ゲームループ } この場合内部で ①をちょっとやって②をちょっとやって また①に戻ってちょっと処理をしてみたいなことをくりかえしているということでしょうか?
guest

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
ppaul

総合スコア24670

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

apa

2021/02/01 14:20 編集

返信ありがとうございます c++のstd::threadはスレッドを増やして論理コアの実行タスクへ送る 論理コアは同時に実行しているように見せられる最大数 12なら12こまで同時に動いてられるように見せることができる。 という認識でしょうか?
guest

0

結末からいえば、OSが管理しています。

スレッドの理解のため、まずはプロセスから理解しましょう。

プロセスとは、プログラム(ソフトウェア)を動作させるための論理的計算資源の集合体です。

例えば、一台のWindowsPC上で複数のソフトを同時利用することがあります。このとき、OSはそれぞれのソフトに独立した計算資源を割り当てます。これがプロセスです。具体的には計算装置(論理CPU)と記憶領域(論理メモリ)が割り当てられます。

この論理CPUがスレッドの正体です。論理的なものなので、複数存在することもあります。並列処理はマルチプロセスかマルチスレッドの2通りの手段があります。特に、論理メモリを共有する場合はマルチスレッドが適切です。

投稿2021/01/14 07:47

HogeAnimalLover

総合スコア4830

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問