모든 스레드가 트리를 통과하는 CUDA 커널이 있습니다. 이 때문에 스레드가 리프에 도달 할 때까지 반복되는 while 루프가 있습니다. 나무를 매 단계마다 따라 가야하는 어린이를 확인합니다. 다음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;
}
이 코드는 무한 루프로 진행한다. 그것이 내가 이상한 것을 발견 한 것입니다. 상수를 반환하는 거리 메서드를 변경하면 작동합니다 (예 : 트리에서 왼쪽으로 이동).
CUDA에서 루프를 놓친 적이 있습니까? 아니면 볼 수없는 숨겨진 버그가 있습니까? 왜냐하면 코드가 무한 루프로 어떻게 움직일 수 있는지 알지 못하기 때문입니다.
숨겨진 버그가 있습니다 :) 호스트에서 실행하고'''tid'''가 무한 루프를 일으키는 지 검사함으로써이 코드를 디버깅 할 수 있습니다. –
호스트에서 실행하고 어떤 tid가 무한 루프를 일으키는 지 검사하는 것은 무엇을 의미합니까? 나는 장치 코드에서 tid 만 얻을 수있다. 나는 nvidea에서 "cuPrintf"를 사용해 보았지만 나는 그것을 신뢰할 수 있는지 확신하지 못했다. –