环境: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个事务来执行操作(一次浮动),它就可以工作。
答案 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. *设备将返回不正确的结果。