0

私は、多少独立して、多数の小さな配列に対して少数の操作を実行する必要があるアルゴリズムに取り組んでいます。

アイデアを与えるには:

  • 通常 0.5k ~ 1k 要素の長さの配列の 1k ソート。
  • ランクが 10 ~ 20 の行列の 1k の LU ソルブ。

すべてがフロートです。

次に、この問題にはいくつかの水平性があります。上記の操作は、10k アレイで個別に実行する必要があります。

また、中間結果を保存する必要はありません。たとえば、並べ替えられた配列を保持する必要はなく、最小の $m$ 要素の合計のみを保持する必要があります。

全体が C++ でプログラムされ、実行されます。私の質問は次のとおりです。CUDA を使用すると、このような問題が大幅に高速化 (2 倍以上) されると思いますか?

4

3 に答える 3

1

ほんのいくつかのヒントですが、すでに組み込まれている可能性があります。

1) m 個の最小要素だけが必要な場合は、最小要素を検索して削除し、m 回繰り返す方がよいでしょう。

2) すでに CPU でコードを並列化しましたか? OpenMPかそこら...

3) より良いハードウェアを購入することを考えましたか? (良い考えではないことはわかっていますが、特定のアプリケーションのパフォーマンス目標を達成したい場合は、それが最も安価な可能性がある場合もあります...)

CUDAでやろうと思えば概念的に動くはずなので、大きな問題は起こらないはずです。ただし、経験などに依存する小さなことは常にあります。

ソート用の推力ライブラリを検討してください。他の誰かが優れた LU 分解アルゴリズムを提案してくれることを願っています。

于 2012-07-18T12:51:09.510 に答える
1

2倍のスピードアップが必要な場合は、GPGPU / CUDAを検討する前に、より簡単な最適化の可能性を最初に検討することをお勧めします。たとえば、x86 では、コードのパフォーマンスが重要な部分を 4 ウェイ浮動小数点 SIMD を使用するように書き直すことで、SSE を使用して潜在的な 4 倍の速度アップを検討するとします。これにより x86 に結び付けられますが、nVidia GPU の存在を必要としないという点で移植性が高くなります。

そうは言っても、冗長な操作を排除したり (無駄なコピーと初期化が好まれます)、メモリ アクセス パターンをよりキャッシュに適したものにするなど、コード ベースにはより単純な最適化の機会さえあるかもしれません。適切なプロファイラーでコードをプロファイリングして、ボトルネックがどこにあるかを確認してください。

ただし、一般に、並べ替えは SIMD または CUDA のいずれにも特に適しているわけではありませんが、LU 分解などの他の操作には十分な利点があることに注意してください。

于 2012-07-18T11:10:41.297 に答える
1

これは 5 行のArrayFireコードで実行できます。これにより、CPU で最大 6 倍のスピードアップが得られます。これにより、Thrust (行列ではなくベクトル用に設計されたもの) よりも 4 倍高速になりました。単一の GPU しか使用していないため、ArrayFire Free バージョンを実行できます。

array x = randu(512,1000,f32);
array y = sort(x); // sort each 512-element column independently
array x = randu(15,15,1000,f32), y;
gfor (array i, x.dim(2))
  y(span,span,i) = lu(x(span,span,i)); // LU-decomposition of each 15x15 matrix

GPU は、メモリ アクセスが 32 の倍数に揃えられている場合に最高のパフォーマンスを発揮することに注意してください。したがって、32x32 マトリックスの束は、31x31 の束よりもパフォーマンスが高くなります。

于 2012-07-18T18:46:17.103 に答える