环境: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 个事务来执行操作(一次浮动一个),它就可以工作。