CUDA:不支持未对齐的内存访问:我缺少什么?

时间:2011-04-20 12:01:12

标签: python cuda gpgpu nvcc

有一些questions与此类似,但在这种情况下,它有点奇怪; NVCC 3.1不喜欢这样,但3.2和4.0RC确实如此;

float xtmp[MAT1];

for (i=0; i<MAT1; i++){
    xtmp[i]=x[p[i]]; //value that should be here
}

其中p通过引用来自...的函数(int * p)传递。

int p_pivot[MAT1],q_pivot[MAT1];

要添加一些上下文,在p到达'top'函数之前,它们会被填充(我为了清晰起见,我正在尽可能多地删除不相关的代码)

...
for (i=0;i<MAT1;i++){
    ...
    p_pivot[i]=q_pivot[i]=i
    ...
}
...

除此之外,对pivot的唯一操作是具有整数临时值的3步交换。

毕竟p_pivot通过(&amp; p_pivot [0])传递给'top'函数

对于任何寻找更多细节的人来说,代码是here,并且在3.2 / 4.0之间翻转所需的唯一变化是更改cudaDeviceSynchronise(); to cudaThreadSynchronize();.这是我脏的实验代码,所以请不要评价我! :d

如上所述,上述所有版本在NVCC的更高版本中都可以正常工作,我正在努力将这些内容放到有问题的机器上,但我有兴趣看看我缺少的东西。

必须是导致问题的数组查找索引,但我不明白为什么?

1 个答案:

答案 0 :(得分:2)

这看起来像是一个编译器错误。这将适用于64位平台上的nvcc 3.1:

float xtmp[MAT1];
//Swap rows (x=Px)
for (i=0; i<MAT1; i++){
    int idx = p[i];
    xtmp[i]=x[idx]; //value that should be here
}

我的猜测是,隐式int to size_t转换中的某些内容正在破坏。对于我尝试的任何新版本的CUDA都不会失败。