2012-12-29 3 views
6

「CUDA Cプログラミングガイド5.0」では、p73に「グローバルメモリに存在する変数のアドレス、またはドライバまたはランタイムAPIのメモリ割り当てルーチンのいずれかによって返される変数のアドレスは、常に256バイト以上に調整されています。私はこの文の正確な意味を知らない。誰かが私のための例を見せてくれますか?どうもありがとう。cuda alignment 256bytes真剣に?

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

の倍数である、すなわち、CUDAランタイムのデバイスのメモリ割り当て関数のいずれかを使用して割り当てられている

+2

任意のcudaMallocの開始アドレスは256の倍数になります。256は2進数の2つのシンボルで、addrexxではゼロになります。 0x0456ad00ではなく0x0456ad80のようなアドレスを取得できます。 – osgx

答えて

8

ポインタはcudaMallocまたはcudaMallocPitchは、256バイトが並んであることが保証されている例:

char *ptr1, *ptr2; 

int bytes = 1; 

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

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

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

重要:

ポインタの位置合わせは常に256ではありません。私のデバイス(GTX460M)では、それは512です。cudaDeviceProp::textureAlignmentフィールドでデバイスポインタのアライメントを取得することができます。

ポインターのアラインメントは、ポインターをテクスチャーにバインドするための要件です。

+2

テクスチャオフセットに頼らずに、cudaMalloc()を介して割り当てられたメモリにテクスチャを簡単にバインドすることは、cudaMalloc()によって提供されるポインタの位置合わせ以外の理由の1つです。 – njuffa

+0

私は派生的な質問を追加しました。 @ sgar91で把握してください。 – Rock

+0

'cudaMalloc()'の結果は、 'cudaDeviceProp :: textureAlignment'以上の整列を持っていますか? – einpoklum