我有一個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」,但我不確定我能否信任它。 –