2014-04-05 157 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