因此,我目前正在尝试在OpenCL中编写内核,其目的是求和将矩阵(g_idata)的每一行减少为一个数组(g_odata)。所述矩阵由具有column_count * row_count长度的float数组表示,所得数组的长度为row_count。因此,我实现了以下内核:
#define T float
#define Operation(X, Y) ((X) + (Y))
__kernel void marrow_kernel( __global T *g_odata,__global T *g_idata,
const unsigned long column_count, const unsigned long row_count, __local volatile T* sdata) {
size_t tid = get_local_id(0);
size_t gid = get_global_id(0);
size_t row = gid / column_count;
size_t column = gid % column_count;
if(row < row_count && column < column_count)
{
sdata[tid] = g_idata[gid];
}
barrier(CLK_LOCAL_MEM_FENCE);
if(row < row_count && column < column_count)
{
size_t step = column_count / 2;
size_t limit = column_count;
while(step > 0)
{
if(column + step < limit) {
if(tid + step < get_local_size(0))
{
sdata[tid] = Operation(sdata[tid], sdata[tid + step]);
}
else if (gid + step < column_count * row_count)
{
sdata[tid] = Operation(sdata[tid], g_idata[gid + step]);
}
}
barrier(CLK_LOCAL_MEM_FENCE);
step /= 2;
limit /= 2;
}
}
barrier(CLK_LOCAL_MEM_FENCE);
if(row < row_count && column == 0)
{
g_odata[row] = column_count % 2 == 0 ? sdata[tid] : sdata[tid] + g_idata[gid + (column_count - 1)];
}
}
当前正在使用128个工作单元的工作组实例化内核。我目前无法控制工作组的大小。
现在是问题所在:如果可以说我有两个不同工作组之间共享的行,它将返回错误的结果,因为它将获取g_idata中的值,因为无法访问下一个工作组本地内存的结果。第一次迭代后,这是错误的值,它将影响操作的最终结果。
任何人都可以给我提示如何解决这个问题?