코드 블록에는 커널 기능이 있습니다. 그것은 필수적으로 모든 점에서 가장 먼 지점을 계산하고 결과는 길이 [3] (점의 ID)에 저장되고 출력 [0]은 속하는 클러스터로부터의 거리입니다. while 피스는 간단한 합계 감소를 수행합니다. 나는 최선의 방법이 아니라는 것을 알고 있지만 왜 하나의 클러스터가 코드가 제대로 작동하는지 이해해야 할 필요가 있습니다. 두 개 이상의 클러스터가있는 insteas는 잘못된 값을 반환합니다.커널의 Opencl 루프
__kernel void computeDistances(__global t_cluster *points,__global t_cluster *clusters, __global float *output,__global t_cluster *support,__global short *lengths)
{
int threadId = get_global_id(0);
float bestVal = 0;
int counter, offset;
short idPoint, idCluster;
for(idPoint = 0; idPoint < lengths[0]; idPoint++)
{
for(idCluster = 0; idCluster < lengths[2]; idCluster++)
{
support[0].attributes[threadId] = pow((points[idPoint].attributes[threadId] - clusters[idCluster].attributes[threadId]) , 2);
counter = SIZE;
offset = 1;
while(counter != 1)
{
counter = counter/2 + (counter % 2);
barrier(CLK_GLOBAL_MEM_FENCE);
if(threadId % (2*offset) == 0)
if(threadId + offset < lengths[1])
support[0].attributes[threadId] = support[0].attributes[threadId] + support[0].attributes[threadId+offset];
offset = offset * 2 ;
}
barrier(CLK_GLOBAL_MEM_FENCE);
if(support[0].attributes[threadId] > bestVal)
bestVal = support[0].attributes[threadId];
}
barrier(CLK_GLOBAL_MEM_FENCE);
if(threadId == 0 && bestVal > output[threadId])
{
output[0] = bestVal;
lengths[3] = idPoint;
}
}
}
이것은 해결책입니다. 고맙습니다! – Manuel