Memory 如何设置OpenCL';本地工作空间的大小?
我正在用OpenCL做一些图像处理 例如,我使用了一个100*200大小的图像。在.cl代码中,我仅通过以下方式将图像像素值减半:Memory 如何设置OpenCL';本地工作空间的大小?,memory,kernel,local-storage,opencl,Memory,Kernel,Local Storage,Opencl,我正在用OpenCL做一些图像处理 例如,我使用了一个100*200大小的图像。在.cl代码中,我仅通过以下方式将图像像素值减半: { int width=get_group_id(0); int height=get_group_id(1); // col(width) int x= get_global_id(0); // row(height) int y= get_global_id(1); (unsigned char) data_output[x*wid
{
int width=get_group_id(0);
int height=get_group_id(1);
// col(width)
int x= get_global_id(0);
// row(height)
int y= get_global_id(1);
(unsigned char) data_output[x*width+y]=
(unsigned char)data_input[x*width+y]/2;
}
在内核参数设置之后,我通过以下方式运行内核:
clEnqueueNDRangeKernel( queue,kernel_DIP,2,NULL,global_work_size,local_work_size, 0,NULL,NULL);
我使用的全局工作大小是图像大小:
size_t global_work_size[2] = {100,200};
我发现即使是.cl代码也不包含一些代码,比如“get_local_id(0);”
当地的工作规模也对演出产生了很大的影响
两者
“规模-本地工作规模[2]={1,1};”(小型本地工作规模)和“规模-本地工作规模[2]={50,50};”(大型工作规模)缓慢
一些合适的尺寸(如以下)会更快:
size_t local_work_size[2]= {10,10};
所以我的问题是:
get\u local\u id()
都不会影响性能。它只是一个在内核中获取工作id的工具,允许在组中执行一些同步任务NULL
- 总本地大小(乘以所有维度)不能高于设备最大本地大小。(CL_设备最大工作组大小)
- 尺寸不能高于CL\ U设备\最大\工作\项目\尺寸中指定的尺寸限制
- 本地工作组大小必须是全局大小的整数除数(在所有维度中)
DarkZeros已经提到,您可以将本地工作大小设置为
null
,让OpenCL根据全局工作大小和执行它的设备选择它认为“合适”的大小
但是,对于某些全局工作大小,OpenCL可能无法选择“合适”的本地工作大小。特别是当全局工作大小是大于最大本地工作大小的素数时。然后可能会强制使用1的本地工作大小。您可以考虑填充您的输入数据,以便它可以很好地分布在几个工作组中。
(我最近在一篇文章中写了几句)
对于复杂内核,可以考虑查询<代码> CLKNELLIORADIORIGHOLGROUP子集,多个并将计算基础放在这一点上,但是对于这个简单的内核,这是不必要的。 此外,您可能想看看“AMD应用程序内核分析程序”或“NVIDIA占用率计算器”-这些工具可能会为某些目标平台提供一些关于适当配置的提示(不过,最好是编写尽可能通用的代码,只要它不会对性能产生太大的影响)