0

環境: Cuda 5.0、GTX 480、windows 7 x64、VS2008

わかりました、まず、これが合法かどうか教えてください:

//this code isnt actually the real code I have on my app
do_something(float *vector) {

   float4 myvar = *(float4*)&vector[threadIdx.x]; //missalignment issues??

}

やや複雑なカーネルを使用しており、同様のコードで奇妙な動作が発生します。各スレッドは 4 つの連続するフロートをフェッチする必要があり、1 つのトランザクションですべてをフェッチする方がよいと考えました。だから私は単一のfloat4としてそれらにアクセスしようとしました...

コンパイラーは文句を言わず、memchecker も問題を起こしません。デバッグモードで実行するとうまくいくようです(よくわかりません、結果をテストできません)。しかし、リリースモードでは「不明なエラー」が発生します。float4 にアクセスしようとすると、128B に合わせてアクセスする必要があるようですが、これは正しいですか? もしそうなら、なぜmemcheckerは文句を言わないのですか? デバッグでは機能し、リリースでは機能しないのはなぜですか??

ところで、操作を実行するために 4 つのトランザクション (一度に 1 つのフロート) を実行すると、機能します。

4

1 に答える 1

3

グローバルサイズとアライメント要件に関するCUDA Cプログラミングガイドから

グローバル メモリ命令は、1、2、4、8、または 16 バイトに等しいサイズのワードの読み取りまたは書き込みをサポートします。データ型のサイズが 1、2、4、8、または 16 バイトであり、データが自然に整列されます (つまり、そのアドレスはそのサイズの倍数です)。

float4 の自然なアライメントは 128 ビットであるため、アクセスは 128 ビットにアライメントする必要があります。

コンピューティング機能 2.0 以降のデバイスでは、ミスアライメント アクセスでハードウェア例外がスローされます。コンピューティング機能 1.* デバイスは、正しくない結果を返します。

于 2013-04-15T13:18:54.103 に答える