2012-02-05 5 views
2

いくつかのベクトルを処理するためにC/C++のアルゴリズムを実装しています。マルチコアCPUで作業しているので、並列化することをお勧めします。私はGPGPUでいくつかの経験があり、メモリアクセスが悪いとパフォーマンス全体が損なわれる可能性があるので、CPU上のコア間に特別なアクセスレイアウトも考慮する必要がありますか?マルチスレッドでのメモリの考慮

おかげ

+2

短い答え:はい。マルチスレッドを使わなくても、CPUは非常に不快なパフォーマンスを持ちます。例:[this](http://stackoverflow.com/q/8547778/922184)および[this](http://stackoverflow.com/q/7905760/922184)。マルチスレッド化は事態をより複雑にします。 – Mysticial

+0

GPGPUを算術演算に使用しなかった場合(そのために設計されたものです)、メモリアクセス制限に問題があった可能性があります。しかし、マルチスレッドに関しては、メモリアクセスのレイテンシよりもコンテキストの切り替えや同期(コンカレントプログラミングでは最大の問題)がはるかに懸念されます。 – Kiril

+0

@リリック:それはすべて関係する仕事のサイズに依存します。ベクトルが短く、作業のコンテキストがほとんどない場合、スイッチングと同期が問題になる可能性があります。ベクトルが長く、作業の実質的なメモリ構成、キャッシュ操作およびコード調整がすべての場合。 –

答えて

4

あなたはマルチプロセッサのセットアップとに実行することができ、そのうちのいくつかは、クロールにアプリケーションを遅くすることができ、メモリ関連の問題がいくつかあります。

  1. リミットデータキャッシュラインの数(自分の書き込み権限特にキャッシュライン)により近い時系列にアクセス:あなたの箱の上にキャッシュラインサイズのおおよそ知っておくと、2つのことを試みる必要がある

    単一のスレッド。つまり、必要以上にキャッシュラインを「ダーティー」にしないでください。

  2. 2つの別々のスレッドを持つペストのように、どちらも1つの書き込みで、同じデータキャッシュラインに同時にアクセスすることは避けてください。

(あなたがページングされなければならない大きなデータ構造を扱っている場合は、上記の2つのルールがまた、データページに適用されます。)

可能性は、(特にヒープ)用に別の作業データ構造を設定します各スレッドは、データを共有するのではなく、特に、すべてのスレッドが更新される共通のカウンタを持つことに注意し、スレッドを絶対に同期させる必要のある重要な接続点を除いて(明らかに)ロックとセマフォを避けてください。

+0

@Hot_Licks、マイナーな調整: –

+0

@KrazyGlew - "データキャッシュライン(特に書き込むキャッシュライン)の数を、クローズドタイムで1つのシーケンスでアクセスすることを制限します。糸。" –

1

@Hot_Licks:実際には、スレッドが同じコアで実行されている2つのハイパースレッドである場合、異なるスレッドにアクセスすることに問題はありません。クリーンラインは、同じインテルCPU上のハードウェアスレッド間で無償で共有されます。汚い線も非常に安く共有されていますが、一方の人が他方の人が書いているときに同時にデータを読んでいるなら、あなたはMOnukesを得ることができます。 (奇妙なことに、2つのハードウェア/ハイパースレッドが同時に書き込みを行っている場合、ペナルティは発生しません)。

AMDの「スレッド型」CPUのBulldozerでは、書き込み共有はさらにコストがかかりません。

しかし、これはハードウェアスレッドにのみ適用されます。インテルハイパースレッディングまたは論理プロセッサーは、同じ物理プロセッサー上で実行されます。彼らが別の物理的なプロセッサで実行されている場合は、勝利しません。ほとんどのソフトウェアスレッドパッケージはスレッドを任意に移行するので、ルールはそれほど悪くありません。

しかし、(a)単一のスレッドによってアクセスされる行と、(b)他のスレッドによって共有されない場合でも、複数のスレッドによってアクセスされる行の合計を最小化する必要があります。キャッシュ(MLC、LLC)は限られたリソースなので、しかし、あなたは正しいです - 一度あなたはキャッシュを欠いている...

関連する問題