【发布时间】:2014-04-09 17:24:40
【问题描述】:
在代码块中有我的内核函数。它本质上计算哪个点离所有集群最远,结果保存在长度[3](点的id)中,并输出[0]与所属集群的距离。 while 部分进行简单的总和减少。我知道这不是最好的方法,但我需要了解为什么让一个集群代码正常工作,而不是两个或更多集群返回错误值。
__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;
}
}
}
【问题讨论】: