2014-04-05 159 views
0

在代码块中有我的内核函数。它主要计算哪个点离所有聚类最远,结果保存在长度[3](点的ID)和输出[0]距离所属簇的距离。这段时间做简单的总和减少。我知道这不是最好的方法,但我需要理解为什么让一个集群代码正常工作,并且有两个或更多集群返回错误的值。内核中的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以更好地了解我所指的内容。

增加群集大小还会增加正在使用的工作项的数量,这可能会使用多个工作组,这就是您遇到此问题的原因。

编辑:它可能值得指出的是,不能跨工作组使用同步原语。

+0

好的,这是解决方案。谢谢! – Manuel