有一些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的更高版本中都可以正常工作,我正在努力将这些内容放到有问题的机器上,但我有兴趣看看我缺少的东西。
必须是导致问题的数组查找索引,但我不明白为什么?
答案 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都不会失败。