由于整个代码是漫长而混乱的方式在这里显示我想知道是否有人有类似的错误。我展示了这些代码片段:
在CUDA内核中
// ismember is completely NaN at this point and pregpu full of double data
// i is the threadID, these count var just some int to navigate through 1 d array
ismember[i * countxyz] = indiceX;
ismember[i * countxyz + 3 * (countx)] = indiceY;
ismember[i * countxyz + 3 * (countx+county)] = indiceZ;
// Output for debug
// here I pretty much return the data from pregpu.
if( i!=20) {
return;
}else{
for(int j = 0 ; j < countx; j++) {
iout[j] = pregpu[i*(countx+county+countz)+j+(i*2)];
}
}
我的输出看起来像这样:
DATA PREGPU
DATA PREGPU
DATA PREGPU
DATA PREGPU
DATA PREGPU
DATA PREGPU
DATA PREGPU
DATA PREGPU
DATA ISMEMBER for like no reason
DATA PREGPU
DATA PREGPU
DATA PREGPU
DATA PREGPU
DATA PREGPU
DATA PREGPU
DATA PREGPU
DATA PREGPU
DATA PREGPU
DATA PREGPU
DATA PREGPU
DATA PREGPU
DATA PREGPU
DATA PREGPU
DATA PREGPU
DATA PREGPU
DATA PREGPU
我计算大约100 k个线程,我得到这个错误30次。每次运行错误都在相同的线程中,具有相同的错误值。我从不在代码的另一部分中调用ismember或iout,所以我100%确定调用是成员[x] = y设置pregpu [x] = y,因为没有理由。如果我单独运行线程它可以工作,所以计算是正确的只是多线程正在制造麻烦。
我很高兴知道是否有人遇到类似的问题,因为我已经没有想法我做错了什么。可能有一些内核的问题,所以他们乱七八糟的数据或在阵列A的Boundss访问数组B超出Bounds的情况下。
我发起的数据如下:
__global__ void trav(double *tout,
double *iout,
double *ismember,
double *pregpu,
double *concatenategpu,
[some another unimportant var]
)
答案 0 :(得分:-2)
所以我通过改变赋予函数的var的顺序找到了错误。
给函数赋予的数组是短的,因此超出范围的索引会触及紧邻的数组。
如果短距离后面没有数组,我只能让Cuda超出界限。