10

マルチコアプロセッサを利用してコードを最適化し、大規模な高密度配列をコピーして操作しようとしています。

コピーの場合: 私は大規模な高密度配列 (約 6000x100000) を持っており、そこから 15x100000 のサブ配列を引き出してパイプでいくつかの計算を行う必要があります。パイプは、マルチコアである blas によって処理される多くの線形代数関数で構成されています。線形代数と比較して、データを取得する時間が実際に問題になるかどうかは未解決の問題ですが、注意を怠らず、データのコピーが最適化されていることを確認したいと思います。

操作用: 要素または行を使用して配列を操作するさまざまな関数があります。これらのそれぞれがマルチコアで実行された場合に最適です。

私の質問は次のとおりです。適切なフレームワーク (OpenML、OpenCL) を使用して、すべての魔法をコンパイラーで発生させるのが最善ですか、それともこれをより高速に実行する優れた関数/ライブラリーはありますか?

4

1 に答える 1

7

あなたの出発点は古き良きものでなければなりませんmemcpy。長い間「コピーパフォーマンス」に取りつかれてきた人からのいくつかのヒント。

  1. すべてのプログラマーがメモリについて知っておくべきことをお読みください。
  2. ここで機能など、システムmemcpyのパフォーマンスをベンチマークします。memcpy_bench
  3. memcpy複数のコアで実行した場合のスケーラビリティをベンチマークします (例:multi_memcpy_bench ここ) 。(マルチソケットの NUMA HW を使用していない限り、マルチスレッド コピーのメリットはあまりないと思います)。
  4. システムの memcpy の実装を掘り下げて理解します。ほとんどの時間を独房で過ごしていた時代はrep movsd過ぎ去りました。前回、gcc と Intel コンパイラの CRT を見たとき、どちらも CPU のキャッシュ サイズに対するコピーのサイズに応じて戦略を変えていました。
  5. Intel では、キャッシュを汚染しないストア命令 (例: movntps)の利点を理解してください。これは、従来のアプローチと比較して大幅なスループットの向上を実現できるためです (これらは 4. で使用されていることがわかります)。
  6. サンプリング プロファイラーにアクセスし、その使用方法を理解して、コピー操作に費やされたアプリの時間を特定します。CPUパフォーマンスカウンターを見て、さまざまなキャッシュが何をしているかなど、あらゆる種類のことを教えてくれる、より高度なツールもあります.
  7. (高度なトピック) TLB と、ヒュージページが役立つ場合に注意してください。

しかし、私の予想では、あなたのコピーは、重いものを持ち上げるのと比較して、かなり小さなオーバーヘッドになるでしょう。数字が何であるかを知っておくのは良いことです。OpenCL などの CPUがここで魔法のように改善を提供するとは思いません (システムの memcpy の実装が不十分でない限り)。IMHO、別のレベルの抽象化を上に重ねてそこから離れるよりも、命令、レジスタ、キャッシュライン、ページのレベルで実際に何が起こっているかの基本に立ち返って、このことをより詳細に掘り下げる方が良いです.

もちろん、現在使用しているマルチコア BLAS ライブラリから GPU アクセラレーション線形代数バージョンにコードを移植することを検討している場合、これはまったく別の (そしてはるかに複雑な) 質問になります (以下の JayC のコメントを参照)。大幅なパフォーマンスの向上が必要な場合は、確かにそれを検討する必要があります.

于 2012-12-23T23:25:32.107 に答える