2

有几个与此类似的问题,但在这种情况下,它有点奇怪;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 到达“顶部”函数之前,它们被填充(为了清楚起见,我尽可能多地删除不相关的代码)

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

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

毕竟 p_pivot 通过 (&p_pivot[0]) 传递给“顶部”函数

对于任何寻找更多细节的人,代码在这里,唯一需要在 3.2/4.0 之间切换到更早的更改是更改 cudaDeviceSynchronise(); 到 cudaThreadSynchronize();。这是我肮脏肮脏的实验代码所以请不要评判我!:D

如前所述,以上所有功能在更高版本的 NVCC 中都可以正常工作,我正在努力将它们放到有问题的机器上,但我很想看看我缺少什么。

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

4

1 回答 1

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 到 size_t 转换中的某些内容正在中断。我尝试过的任何较新版本的 CUDA 都不会失败。

于 2011-04-20T18:14:02.937 回答