7

私はVisual Studio 2012を使用しています.xmlを介して対応するパスをたどった後、ハードディスクから膨大なファイルセットを読み取る必要があるモジュールがあります。このために私はやっています

std::vector<std::thread> m_ThreadList;

while ループでは、次のような新しいスレッドをこのベクトルに押し戻しています。

m_ThreadList.push_back(std::thread(&MyClass::Readfile, &MyClassObject, filepath,std::ref(polygon)));

私の C++11 マルチスレッドの知識は限られています。ここでの質問は、特定のコアでスレッドを作成する方法です。私は、vs2012 の parallel_for と parallel_for_each を知っています。これにより、コアが最適に使用されます。しかし、標準の C++11 を使用してこれを行う方法はありますか?

4

3 に答える 3

5

他のコメントで指摘されているように、C++ にはそのようなアーキテクチャの詳細に関する知識がないため、「特定のコアで」スレッドを作成することはできません。さらに、ほとんどの場合、オペレーティング システムは、コア/プロセッサ間のスレッドの分散を十分に管理できます。

とはいえ、コア間でスレッドの特定の分散を強制すると、パフォーマンスが向上する場合があります。たとえば、特定の 1 つのコアでスレッドを強制的に実行することにより、異なるプロセッサ キャッシュ間のデータ移動を最小限に抑えることができる場合があります (これは、特定のメモリ バウンド シナリオでのパフォーマンスにとって重要になる可能性があります)。

この道をたどりたい場合は、プラットフォーム固有のルーチンを調べる必要があります。たとえば、POSIX スレッドを使用する GNU/linux の場合pthread_setaffinity_np()、FreeBSDcpuset_setaffinity()や WindowsSetThreadAffinityMask()などで必要になります。

興味があれば、ここに関連するコード スニペットをいくつか示します。

http://gitorious.org/piranhapp0x/mainline/blobs/master/src/thread_management.cpp

于 2013-04-04T09:30:11.370 に答える
2

コア アフィニティが std::thread に含まれていないことは確かです。OS が利用可能なコアを最大限に活用できることを前提としています。最も極端な場合を除いて、OS の決定に勝るものはありません。したがって、この仮定は公正なものです。

そのルートをたどる場合は、コードに意思決定を追加して、マシンのアーキテクチャを考慮して、実行するすべてのマシンの OS よりも優れた決定を行う必要があります。それには大変な労力がかかります!まず、コンピューターのコア数と一致するようにスレッドの数を制限する必要があります。また、マシンで他に何が起こっているかについての知識もありません。OSはそうです!

これがスレッドプールが存在する理由です。デフォルトでは、コアと同じ数のスレッドを持つ傾向があり、言語ランタイムによって自動的に設定されます。AFAIK C++11にはそれらの1つがありません。したがって、最適なパフォーマンスを得るためにできることの 1 つは、コアの数を調べて、必要なスレッドの数をその数に制限することです。それ以外の場合は、OS を信頼するのがおそらく最善です。

Joachim Pilborg のコメントは、各スレッドによって行われる作業が I/O オーバーヘッドを上回らない限り、注意を払う価値があります。

于 2013-04-04T04:59:24.850 に答える
0

スレッドをコアにディスパッチするコンテキストでのスレッド化の簡単な概要として:

最新の OS のほとんどは、カーネル レベルのスレッド、つまりハイブリッドを利用しています。カーネル レベルのスレッド化では、OS は各プロセスのすべてのスレッドを「認識」します。Java で採用されているユーザー レベルのスレッドとは対照的に、OS は単一のプロセスを認識し、スレッド化の知識はありません。現在、カーネルレベルのスレッド化により、OS はプロセスの個別のスレッドを認識し、特定のコアへのディスパッチを管理できるため、真の並列処理 (同じプロセスの複数のスレッドが異なるコアで実行される) の可能性があります。ただし、プログラマーとして、これを制御することはできません。std::thread; OSが決定します。ユーザー レベルのスレッド化では、スレッドのすべての管理はユーザー レベルで行われます。Java では、ライブラリが「ディスパッチ」を管理します。ハイブリッド スレッドの場合、カーネル スレッドが使用されます。各カーネル スレッドは、実際にはユーザー レベルのスレッドのセットです。

于 2016-06-16T22:19:53.970 に答える