3

いくつかの整数の同期にpthreadミューテックスを使用するマルチスレッドプログラムがあります。
もちろん、それはうまくスケーリングしません。
データを共有する最善の方法は、すべての共有データを削除することですが、全体的な「タスク数」(共有整数によって決定される)がこの値より大きくならないようにする必要がある場合はどうすればよいですか?この整数をスレッド間で単純に分割することは機能しないことを考慮してください。1つのスレッドは他のスレッドよりも高速に実行でき、他のスレッドが機能し続けると停止します。
また、共有整数でアトミック操作を使用することも機能しません。スレッド数が多い場合、書き込み共有のためにパフォーマンスが低下します。
更新:スレッドを一時停止することは非常に望ましくありません。スケーラビリティだけでなく、スレッドの遅延の決定論的な時間も必要です。

4

1 に答える 1

1

各スレッドに独自のカウンターを与えます。(スレッドローカルストレージまたはそのスレッド専用のページで、バウンスキャッシュラインがないことを確認します。)「全体のタスクカウント」を提供する必要がある場合は、制御スレッドにすべてのタスクからカウンターを読み取らせます。他のスレッドを 1 か所にまとめます。

完全なカウントが必要な場合は、すべてのスレッドに作業を中断するように指示できます。カウントが近いが完全ではないことを気にしない場合は、実行を続けてください。各スレッドは独自のデータのみを書き込むため、共有カウンターでミューテックスを使用するよりもはるかに高速に実行する必要があります。整数書き込みは、SPARC を除くほぼすべてのプラットフォームでアトミックです。SPARC を気にしないのであれば、整数への部分書き込みを防ぐために何もする必要はありません。

于 2012-06-28T23:43:33.500 に答える