我正在为不同的设备开发OpenCL代码。目前,我使用的是Rockchip RK3588 (OpenCL device -马里G 610 r0p0)。该程序算法最初是在CUDA上编写的,其翘曲尺寸为32。在OpenCL中,这个值被命名为“子工作组大小”(计数当前时间运行的工作项)。此外,这个值可以从值CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE中得到。
例如,在Intel上,我可以使用__attribute__((intel_reqd_sub_group_size(32)))设置这个值。现在,在“马里-G 610 r0p0”中,我得到了"CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE = 16",但是程序工作不正确,我需要将这个值更改为32。
<clinfo> returned me the next info:
................
Preferred work group size multiple (device) 16
Preferred work group size multiple (kernel) 16
Max sub-groups per work group 64
................也许有人能帮我解决这个问题?
发布于 2022-03-30 16:12:51
你不正确地解释了这个价值。“首选工作组大小倍数”值就是:一个首选项。OpenCL API告诉您,它更喜欢工作组的倍数为16,但如果绝对需要的话,您可以指定其他大小。但是,幸运的是,你需要一个32的大小,它是非常满意的。
您实际上需要做的是在将内核排队到GPU时手动指定工作组大小。如果您不指定它,API将自己确定大小应该是什么,虽然它的猜测通常很好,但是如果您在工作组本身的级别上工作(在简化算法中非常常见),您可能需要手动指定它。
当您提交内核时,应该使用类似于以下代码的代码:
size_t globalWorkSize[] {512};
cl_event event;
clEnqueueNDRangeKernel(
command_queue,
kernel,
1, //work_dim
nullptr, //global_work_offset
globalWorkSize,
nullptr, //local_work_size
0, //num_events_in_wait_list
nullptr, //event_wait_list
&event
);您需要添加一个显式指定工作组大小的参数:
size_t globalWorkSize[] {512};
size_t localWorkSize[] {32}; //Will create 16 work groups
cl_event event;
clEnqueueNDRangeKernel(
command_queue,
kernel,
1, //work_dim
nullptr, //global_work_offset
globalWorkSize,
localWorkSize,
0, //num_events_in_wait_list
nullptr, //event_wait_list
&event
);https://stackoverflow.com/questions/71676880
复制相似问题