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;
}
}
}
好的,這是解決方案。謝謝! – Manuel