我有一个CUDA内核,每个线程遍历一棵树。正因为如此,我有一个循环,直到线程到达叶子为止。在树下的每一步都会检查应该选择哪个孩子。CUDA内核中的无限循环
的代码如下:
__global__ void search(float* centroids, float* features, int featureCount, int *votes)
{
int tid = threadIdx.x + blockIdx.x * blockDim.x;
if(tid < featureCount)
{
int index = 0;
while (index < N)
{
votes[tid] = index;
int childIndex = index * CHILDREN + 1;
float minValue = FLT_MAX;
if(childIndex >= (N-CHILDREN)) break;
for(int i = 0; i < CHILDREN; i++)
{
int centroidIndex = childIndex + i;
float value = distance(centroids, features, centroidIndex, tid);
if(value < minValue)
{
minValue = value;
index = childIndex + i;
}
}
}
tid += blockDim.x * gridDim.x;
}
}
__device__ float distance(float* a, float* b, int aIndex, int bIndex)
{
float sum = 0.0f;
for(int i = 0; i < FEATURESIZE; i++)
{
float val = a[aIndex + i] - b[bIndex + i];
sum += val * val;
}
return sum;
}
此代码进入无限循环。这是我觉得奇怪的。 如果我改变distance方法返回一个常量,它就起作用(即遍历树中的左边)。
我错过了CUDA中的循环,还是只有一些隐藏的错误,我看不到?因为我没有看到代码如何进入无限循环。
有一个隐藏的bug :)你可以尝试调试这个代码,在主机上执行它并检查哪个''tid'''导致无限循环。 –
通过在主机上执行并检查哪个tid导致无限循环,你是什么意思?我只能从设备代码中获得tid :)我尝试使用nvidea的“cuPrintf”,但我不确定我能否信任它。 –