我试图通过识别3d体积位置和组ID来计算每个组的局部总和。
我的想法是将空间划分为组并使用atomic_add来计算local_sum。 但是因为我是并行计算的新手,所以很难找到代码和指令之间的相关性。 我当前的内核就像:
__kernel void TestAtomicAddLocal(__global *int src, int3 size, __global int *res)
{
int x = get_global_id(0);
int y = get_global_id(1);
int z = get_global_id(2);
if( x >= vol_dim.x || y >= vol_dim.y || z >= vol_dim.z ){ return; }
int id = x + y * vol_dim.x + z * vol_dim.x * vol_dim.y;
// local mem shared by all work items in work group,
//so this can be accessed by all items in current workgroup
__local int local_sum;
local_sum= 0;
// use global_id to access the value of input array
int local_offset = atomic_add(&local_sum, src[id]);
barrier(CLK_LOCAL_MEM_FENCE);
int global_offset = atomic_add(&num_verts[0], local_sum);
barrier(CLK_GLOBAL_MEM_FENCE);
}
对于主机部分,我的设置是
enqueueNDrangeKernel( cq, kn_testAtomicAddLocal, 3, 0, cl::size3(256,256,256), cl::size3(64, 64, 64), 0, 0, 0);
对于kenrnel参数,* src为cl_mem
,大小为256*256*256*sizeof(cl_int)
,大小为4 * sizeof(cl_int)
,* res为cl_mem
,大小为4*sizeof(int)
。
然后我得到CL_OUT_OF_RESOURCE和CL_INVALID_GROUP_SIZE的错误,根据我的理解,我的设备最大组大小是1024,但是这里总组=(256/64)^ 3 = 64< 1024。
我的gpu max工作项目大小是1024x1024x64,这也没关系。所以我认为必须有一些我理解的错误。我希望有人可以帮助我。
答案 0 :(得分:0)
最大组大小限制您的64 * 64 * 64部分。
我猜你正在使用CUDA卡。你最好在CUDA卡上使用CUDA。 OpenCL或多或少地在CUDA卡上模拟。如果你不是,我认为所有AMD卡的组大小限制为256.编辑:嗯......我忘记了英特尔的。如果是这样,请忽略此部分。
更重要的是,您最好先在互联网上查看一些简化逻辑实现示例。原子是非常有用的,像你所做的那样使用它们几乎可以确保你的GPU代码比CPU代码慢。