3

一般的な方法 (集約/選択/変換) で大量のデータを操作する C/C++ アプリケーションを開発しています。私は AMD Phenom II X4 965 Black Edition を使用しているので、かなりの量の異なるキャッシュがあります。

すべての単一操作を実行するために、ST バージョンと MT バージョンの両方の関数を開発しましたが、驚くことではありませんが、最高の場合、MT バージョンは4コアを使用している場合でも ST よりも 2 倍高速です。

私は利用可能なリソースの 100% を使用するのが好きなので、2 倍しかないという事実に腹を立てました。4 倍が必要です。このため、キャッシュ シミュレーターとコールグラフを使用して、
すでにかなりの時間を-pgvalgrindに費やしてきました。プログラムは期待どおりに動作しており、コアは入力プロセス データ (つまり、データに適用する操作) を共有しており、さまざまなスレッドが処理対象のデータ (何百万ものエンティティまたは行) をロードすると、キャッシュ ミスが報告されます (予想どおり)。今、あなたが私がやろうとしていることを知っているなら:-))。最終的に、g++ と clang++ の異なるコンパイラを-O3を指定して使用しましたが、パフォーマンスは同じです。

私の結論は、処理するデータが大量 (GB のデータ) であるため、最終的にデータを CPU にロードする必要があるという事実を考えると、これは実際の待機時間です。ソフトウェアをさらに改善できますか? 限界に達しましたか?

Linux x86-64、Ubuntu 11.10 で C/C++ を使用しています。ぜひ聞きたいです!:-)

4

1 に答える 1

1

それはどのようなアプリケーションですか?コードを見せていただけますか?

コメントしたように、RAM 帯域幅などのハードウェア制限に達した可能性があります。もしそうなら、ソフトウェアのトリックはそれを改善できませんでした。

MPI、OpenMP、または OpenCL (GPU 上) を使用して調査することもできますが、アプリケーションのアイデアがなければ、私たちは助けることができません。

GCC でコンパイルし、プロセッサのキャッシュ プリフェッチを支援したい場合は、慎重に節約して__builtin_prefetchを使用することを検討してください(ただし、使用しすぎたりひどく使用したりすると、パフォーマンスが低下します)。

于 2012-07-28T09:41:36.790 に答える