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

编译器不会抱怨,memchecker 也不会出错。在调试模式下运行它似乎有效(不确定,无法测试结果)。但在发布模式下,它会给出“未知错误”。看来,如果我尝试访问 float4,我必须将其与 128B 对齐,这是正确的吗?如果是,为什么 memchecker 不抱怨?为什么它在调试时有效而在发布时无效?

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

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 回答