float4未对齐访问?调试工作,发布没有

时间:2013-04-15 11:14:31

标签: visual-studio-2008 cuda

环境: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个连续的浮点数,我认为在单个事务中获取它们会更好。所以我尝试将它们作为单个float4 ...

进行访问

编译器没有抱怨,memchecker也没有任何错误。在调试模式下运行它似乎工作(不确定,无法测试结果)。但在发布模式下,它会产生“未知错误”。似乎如果我尝试访问一个float4,我必须将它与128B对齐,这是正确的吗?如果是的话,为什么memchecker不抱怨?为什么它在调试时起作用而在发布时不起作用?

顺便说一句,如果我执行4个事务来执行操作(一次浮动),它就可以工作。

1 个答案:

答案 0 :(得分:3)

来自Global Size and Alignment Requirements

上的CUDA C编程指南
  

全局内存指令支持读取或写入大小的单词   等于1,2,4,8或16个字节。任何访问(通过变量或   (指针)驻留在全局内存中的数据编译为单个全局   存储器指令当且仅当数据类型的大小为1,2时,   4,8或16字节,数据自然对齐(即其地址   是这个大小的倍数。)

float4的自然对齐是128位,因此您的访问必须与128位对齐。

计算功能2.0及更高版本的设备,在未对齐访问时抛出硬件异常。计算能力1. *设备将返回不正确的结果。