スレッドはstd::async(func)
によって開始されます。CPUコア/スレッドの数に一致する複数のスレッドを実行すると、各スレッドは別のコア/スレッド上で実行されますか?
どうすればいいですか?
スレッドはstd::async(func)
によって開始されます。CPUコア/スレッドの数に一致する複数のスレッドを実行すると、各スレッドは別のコア/スレッド上で実行されますか?
どうすればいいですか?
標準は、あなたのスレッドが実行されますどのようなコア/ハイパースレッド上については何も保証するものではありません。これはオペレーティングシステムに依存します。
あなたは、プラットフォーム固有の(非ポータブル)を取得したい場合は、スレッドの親和性を制御するための各種APIのがある - などの(例えば)pthread_setaffinity_npは、Linux上で。 しかし、私は個人的にはOSに任せておくようアドバイスしています。非常にの特定のニーズがある場合を除き、おそらく良い仕事をするでしょう。ジェスパーの答えを補完するもので
、標準では、ハードウェアスレッドコンテキスト(0情報が利用できない場合)の数を取得するためにあなたの機能std::thread::hardware_concurrency
を提供しています。
スレッドのスケジュール方法は実装によって異なります。しかし、あなたのコードは、自分のスレッドで実行されている12個のOSプロセス/サービス/デーモンとコアを共有する必要があります。
std::async(func)
というご質問のところでは、起動ポリシーを強制することができます(例:launch::async
)。実装によっては、細かい制御が可能ですが、スケジューリングは実装に依存します。
パフォーマンスを気にする必要がない場合に限り、コアの選択肢をOSに任せることができます。 – SergeyA
私は同意し、私は同意しません。私の経験では、OSは大部分の時間に賢明な/正しいことを行い、それについて心配する必要はありません(それ以外にOSは何ですか?)。ほとんどの場合、人々はOSを賢明にしようとすると、実際には状況が悪化してしまいます。いくつかの稀なケースでは、人々はOSを徹底的に凌駕する本当の理由があります。*それを実行するのに十分な能力を持ち、そうすることでパフォーマンスが向上します。しかし、それは私の経験では本当にまれなケースです。したがって、デフォルトでは、それをOSに任せてください。 –
問題は、OSesが、より大きな利益のためにそれを信じているときに、物事をシャッフルするのが大好きだということです。その結果、スレッドは別のCPUに追い出され、すべてのキャッシュは無効になります。だからあなたは、あなたのアプリケーションの遅延を説明するのがランダムで難しいだけです。厄介な驚き。そのため、私の作業ラインでは、実行単位は常にコアにバインドされています。 – SergeyA