1

軽量スレッドを使用して並列アルゴリズムを実行していますが、システムが複数のコアと複数のチップを提供している場合、これらがどのように異なるコアに割り当てられているのか疑問に思っています。チップ上のすべてのコアが使い果たされるまで、スレッドは単一のチップに割り当てられますか? チップ間で作業をより適切に分散するために、スレッドは異なるチップのコアに割り当てられていますか?

4

2 に答える 2

3

どの OS を使用しているかはわかりませんが、Linux では、コアの負荷に基づいてスレッドがコアに割り当てられます。スレッド アフィニティを設定して特に指定しない限り、実行可能なスレッドは負荷が最も低いコアに割り当てられます。でこれを行うことができますsched_setaffinity()。詳細については、man ページを参照してください。一般的には、meyes1979 さんが言ったように、これは使用している OS に実装されているスケジューラーによって決定されるものです。

使用している Linux のバージョンに応じて、役立つ記事が 2 つあります。この記事では 2.6.22 までの初期の 2.6 カーネルについて説明しこの記事では 2.6.23 より新しいカーネルについて説明します

于 2012-03-27T05:24:03.070 に答える
0

スレッド化ライブラリが異なれば、スレッド化操作の実行方法も異なります。最近の Linux の「標準」はNPTLで、プロセスと同じレベルでスレッドをスケジュールします。Linux ではプロセスの作成が高速であり、常に高速な状態を維持するように意図されているため、これは問題ありません。

Linux カーネルは、実行中のプロセスとスレッドに非常に強力な CPU アフィニティを提供して、キャッシュ ヒットとキャッシュ ミスの比率を高めようとします。タスクが常に同じコアで実行される場合、キャッシュ ラインが事前設定されている可能性が高くなります。

これは通常は良いことですが、カーネルが常にタスクを使用中のコアからアイドル状態のコアに移行するとは限らないことに気付きました。この動作はバージョンごとに変わる可能性がありますが、他の 3 つのコアがアイドル状態である間に、複数の CPU バウンド タスクがすべて 1 つのコアで実行されていることがわかりました。(1 つのコアが他の 3 つよりも摂氏 6 ~ 7 度高いことに気づいて、それを見つけました。)

一般に、正しいことが起こるはずです。ただし、カーネルがタスクを他のプロセッサに自動的に移行しない場合は、コマンドを使用してプログラムに許可されているプロセッサを制限するか、関数を使用して個々のスレッドを移行するように要求するようtaskset(1)にプログラムを変更できます。pthread_setaffinity_np(3)(これはおそらく社内アプリケーションに最適です。ユーザーの 1 人が、使用可能なすべてのコアをプログラムで使用することを望まない場合があります。プログラム内にこの関数の呼び出しを含めることを選択した場合は、構成ファイルを介して構成可能であることを確認してください。プログラムと同様の機能を提供しますtaskset(1)。)

于 2012-03-27T22:15:06.760 に答える