我在OpenCL代码中遇到了一个问题,我尝试在内核中进行同步:
__kernel void pdiffs (__global const long2 *inData, __global const long2 *inData2, __global long2 *outData) {
long2 diffSum = 0;
uint idx0 = get_local_size(0)*get_group_id(0);
for (uint idx=idx0; idx<idx0+get_local_size(0); idx += 1) {
diffSum += inData[idx] - inData2[idx];
outData[get_group_id(0)] = diffSum;
printf("%d %d %d %d/%d\n", get_group_id(0), get_num_groups(0), get_local_size(0), diffSum.x, diffSum.y);
barrier(CLK_GLOBAL_MEM_FENCE|CLK_LOCAL_MEM_FENCE);
if (get_group_id(0) == 0) {
for (size_t i = 1; i < get_num_groups(0); i++){
outData[0] += outData[i];
printf("v(%d): %d/%d\n", i, outData[i].x, outData[i].y);
}
}
}
(我知道这段代码很糟糕......)
我只是认为障碍会同步单个组,因此定义了outData
中的值。但我的跟踪显示有些差异没有计算并且包含零(我设置我的数据所以所有都应返回值1,但有些显示为0)。此外,我是否有printf
语句也有所不同。没有printf
,更多的差异似乎是不正确的。