環境: 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 つのフロート) を実行すると、機能します。