9

「CUDACプログラミングガイド5.0」のp73(ここでも)には、「グローバルメモリに存在する変数、またはドライバまたはランタイムAPIからメモリ割り当てルーチンの1つによって返される変数のアドレスは、常に少なくとも256バイトに整列されます」と記載されています。この文の正確な意味はわかりません。誰かが私のために例を示すことができますか?どうもありがとう。

派生的な質問:では、基本要素(intなど)または自己定義要素の1次元配列を割り当てるのはどうですか?配列の開始アドレスは256Bの倍数になりますが、配列内の各要素のアドレスは必ずしも256Bの倍数ではありませんか?

4

1 に答える 1

12

CUDAランタイムのデバイスメモリ割り当て関数のいずれかを使用して割り当てられるポインタ。たとえばcudaMalloccudaMallocPitch256バイトで整列されることが保証されています。つまり、アドレスは256の倍数です。

次の例を考えてみましょう。

char *ptr1, *ptr2;

int bytes = 1;

cudaMalloc((void**)&ptr1,bytes);
cudaMalloc((void**)&ptr2,bytes);

返されるアドレスptr1が256の倍数であるとすると、返されるアドレスはptr2少なくともになります(ptr1 + 256)

これは、メモリが割り当てられているデバイスによって課せられる制限です。ほとんどの場合、パフォーマンス上の理由から、ポインターは整列されます。(一部のNVIDIAの人は、他の理由もあるかどうかを知ることができるはずです)。

重要:

ポインタの配置は必ずしも256ではありません。私のデバイス(GTX460M)では、512ですcudaDeviceProp::textureAlignment。フィールドによってデバイスポインタの配置を取得できます。

ポインタの配置は、ポインタをテクスチャにバインドするための要件でもあります。

于 2012-12-29T15:50:06.157 に答える