1

GPU で次元 K x N の 2 次元配列を処理する必要があります。ここで、K は小さい数 (3、4、または 5) であり、N は数百万から数億の値です。処理は一度に 1 列の K 要素に対して行われ、各列はカーネルの個別の呼び出しによって処理されます。GPU で K x N 配列を表現する最も効率的な方法は次のとおりです。

1) 1 次元配列で、列の K 個の要素を連続した場所に配置して、各スレッドが要素 K*thread_id、K*thread_id + 1、...、K*thread_id + K - 1 を処理するようにします。

2) K 個の個別の 1-D 配列として、各配列は元の配列の 1 行を格納します。

3) 他の何か

ありがとうございました!

4

1 に答える 1

2

オプション2はあなたのケースに適しています。

オプション 2 のデータ レイアウトは配列の構造 (SoA) と見なすことができますが、オプション 1 は構造の配列 (AoS) です。

一般に、GPU プログラミングでは SoA の方が AoS よりも優れています。このトピックについては、SoA のパフォーマンスが優れている理由を示す多くの議論があります。

http://developer.download.nvidia.com/CUDA/training/introductiontothrust.pdf

http://my.safaribooksonline.com/book/-/9780123884268/chapter-6dot-effectively-using-gpu-memory/st0045_b9780123884268000069

各スレッドは K 個の要素に 1 つずつアクセスするため、オプション 1 の AoS レイアウトはストライド メモリ アクセスの問題につながり、パフォーマンスを損なう可能性があります。これについては、次に説明します。

https://developer.nvidia.com/content/how-access-global-memory-effectively-cuda-cc-kernels

この問題は、L2 キャッシュを十分に大きくすることで緩和できますが、AoS を回避することは、パフォーマンスを向上させるためのより確実な方法です。

于 2013-03-20T10:01:15.717 に答える