0

CUDA C++ でスレッドごとに 128 ビット データをロードする必要があります。この場合、最大のパフォーマンスと CPU のコードとの互換性のために使用する方がよいでしょうか? データにアクセスする次の例は、同等のパフォーマンスを発揮しますか?

1: 次の 2 つを使用します。

unsigned __int64 src1 = arr[threadIdx.x/2];
unsigned __int64 src2 = arr[threadIdx.x/2 + 1];

2: 使用:

struct T_src { unsigned __int64 src1, src2; };
T_src src = arr[threadIdx.x];

3: 特定のタイプの CUDA を使用する:

ulong2 src =  arr[threadIdx.x];
4

1 に答える 1

1

CUDAで定義されたタイプとプリミティブを使用してGPUの「ネイティブ」用語でメモリにアクセスすることは、パフォーマンスを最大化するための最も可能性の高い方法です。これはあなたの質問のオプション#3を意味します。

CUDAで実行され、再コンパイル時にスタンドアロンCPUでも実行できるコードを作成する場合は、最初にCUDAパフォーマンスをコーディングしてから、ホストCPU実行用にバックポートすることをお勧めします。CUDAは、ほとんどのホストCPUアーキテクチャよりも、設定や構造化の方法に注意を払っています。CUDAに対して「正しく」実行することによるパフォーマンス上の利点は、ホストCPUの場合にわずかに最適ではないことを実行するコストをはるかに上回ります。

CUDAケースにはオプション#3を使用し、ホストCPUケースにはulong2構造を定義します。ホストCPUケースでその構造をコピーするには、バックグラウンドで2つ(または4つ)のメモリ移動が必要ですが、ソースコードで何をするかに関係なく必要になります。最も単純で、読みやすく、理解しやすいソーススタイルを使用し、コンパイラに手間のかかる作業を任せます。

于 2012-08-21T16:26:59.280 に答える