C ++ 17並列 `for_each`のスレッド数を制限することは可能ですか?


10

私はstd::for_eachwith を使用しstd::execution::parて、構造のベクトルとして表される巨大な入力に対して複雑な計算を実行します。計算には、ハードウェア(ネットワークやディスクIOなど)に関連する遅延は必要ありません。これは「単なるCPU」計算です。私にとっては、ハードウェアスレッドのようにOSスレッドを増やす必要はないのは当然のことです。ただし、Visual C ++ 2019では、平均50スレッドが作成され、ハードウェアスレッドが12しかない場合でも最大500スレッド作成されることがあります。

並列スレッドを制限するが方法はにカウントされhardware_concurrencystd::for_eachおよびstd::execution::par、またはカウント合理的なスレッドを作成するための唯一の方法はでカスタムコードを使用することですかstd::thread


open-std.org/jtc1/sc22/wg21/docs/papers/2016/…-しかし、それでも提案だと思いますか?
カラミエル

1
これがいつか標準になるとはいえ、スレッドプールの主な問題はstd::for_each<algorithm>ヘッダーのその他のアルゴリズムよりもはるかに低いレベルであることです。背後にstd::execution::parある主なアイデアは、並列コードを順次コードと同じくらい単純にすることと、最小限のコードとセマンティクスの変更で既存のアルゴリズムを並列化することです。
Vitalii

回答:


5

C ++ 17並列のスレッド数を制限することは可能for_eachですか?

いいえ、少なくともC ++ 17ではできません。ただし、executors今後の標準では、高レベルのSTLアルゴリズムインターフェイスの実行コンテキスト(場所と時間に関して)に影響を与える機能を提供する提案があります。

thread_pool pool{ std::thread::hardware_concurrency() };
auto exec = pool.executor();
std::for_each(std::execution::par.on(exec), begin(data), end(data), some_operation);

それまで、あなたはどちらか信頼に彼は、全体的なパフォーマンスのために最善であるかを知っていることをあなたのコンパイラのベンダーを持っているなどとしてのVisual Studioの開発者の状態

私たちの実装でのスケジューリングは、Windowsシステムスレッドプールによって処理されます。スレッドプールは、システム上の他のスレッドが実行していること、スレッドが待機しているカーネルリソースなど、標準ライブラリでは利用できない情報を利用します。スレッドを作成するタイミングと終了するタイミングを選択します。また、C ++を使用していないコンポーネントを含む他のシステムコンポーネントと共有されます。

もう1つのオプションは、標準ライブラリのみに依存することをあきらめて、すでに新しい提案を特徴としているSTL実装を使用することです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.