2014-04-05 1 views
0

코드 블록에는 커널 기능이 있습니다. 그것은 필수적으로 모든 점에서 가장 먼 지점을 계산하고 결과는 길이 [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; 
    } 
} 

}

답변

1

여러 개의 컴퓨팅 코어 (작업 그룹)를 통해 동기화하는 데 사용할 수없는 장벽을 사용하고 있습니다.

경계 동기화는 동일한 논리 작업 그룹 내에서만 작동합니다.. 내가 말하는 내용을 더 잘 이해하려면 this post on Khronos을 참조하십시오.

클러스터 크기를 늘리면 사용중인 작업 항목 수가 늘어나므로이 문제가 발생하는 작업 그룹이 두 개 이상일 수 있습니다.

EDIT : 작업 그룹 간에는 동기화 프리미티브를 사용할 수 없다는 점을 지적 할 가치가 있습니다.

+0

이것은 해결책입니다. 고맙습니다! – Manuel