【问题标题】:OpenCL local_work_size issuesOpenCL local_work_size 问题
【发布时间】:2011-07-27 00:13:41
【问题描述】:

我有一个大小为 n 的向量(在主程序启动之前未知),我想试验一下工作组的大小。但是,除非我将 local_work_size 设置为正好整除 n 的数字,否则我只会在下面的 fprop 中得到 0 值。

内核:

__kernel void palt(__global double *fprop, __global const double *fcoll,
                   __global const int *nn, const uint max_size)
{
    size_t l = get_global_id(0);

    if( l > max_size ) return;

    fprop[l] = fcoll[nn[l]];

}

主机代码:

int block_sz_p = 128;
const int max_size = ns*imax;

// set the parameters for the propagation operator
errNum = clSetKernelArg(propagation_kernel, 0, sizeof(cl_mem), &fpd);
errNum |= clSetKernelArg(propagation_kernel, 1, sizeof(cl_mem), &fcd);
errNum |= clSetKernelArg(propagation_kernel, 2, sizeof(cl_mem), &nnd);
errNum |= clSetKernelArg(propagation_kernel, 3, sizeof(int), (void *) &max_sz);
checkErr(errNum, "clSetKernelArg(propagation)");

// specify the work group size/dim
const size_t work_dim = 3;  
const size_t global_work_size_propagation[] = {imax*ns, 1, 1};
const size_t local_work_size_propagation[] = {block_sz_p, 1, 1};

// propagation
clEnqueueNDRangeKernel(queue, propagation_kernel, work_dim, NULL, 
                       global_work_size_propagation, local_work_size_propagation,
                       0, NULL, &event);

clWaitForEvents(1, &event); 
clGetEventProfilingInfo(event, CL_PROFILING_COMMAND_START, 
                        sizeof(cl_ulong), &start, NULL);
clGetEventProfilingInfo(event, CL_PROFILING_COMMAND_END, 
                        sizeof(cl_ulong), &end, NULL);
tker2 = (end-start);

这里发生了什么?

【问题讨论】:

    标签: opencl


    【解决方案1】:

    您应该检查 CL 错误,clEnqueueNDRangeKernel 和其他调用返回错误代码(其他通过引用返回错误代码)。

    我认为问题在于全局工作组大小不能被本地工作组大小整除,这不受支持并会生成 CL 错误:

    CL_INVALID_WORK_GROUP_SIZE,如果指定了 local_work_size 并且 global_work_size 指定的工作项数不能被 local_work_size 给出的工作组大小整除,或者与使用内核指定的工作组大小不匹配程序源中的 attribute((reqd_work_group_size(X, Y, Z))) 限定符。

    来自 clEnqueueNDRangeKernel man page

    【讨论】:

    • 最初我认为这是问题所在,但 NVIDIA 论坛上的用户向我保证,可以使用上面的 if 构造来规避约束。我想我将不得不填充向量。谢谢。
    • @kyky 绕过约束没有意义,您真的想要不同大小的本地工作组吗?
    猜你喜欢
    • 2015-10-24
    • 2018-07-05
    • 1970-01-01
    • 2020-06-27
    • 2011-04-27
    • 2018-01-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多