Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Memory 如何设置OpenCL';本地工作空间的大小?_Memory_Kernel_Local Storage_Opencl - Fatal编程技术网

Memory 如何设置OpenCL';本地工作空间的大小?

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

我正在用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*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_local_id()的代码也会受到本地内存的影响

  • 如何设置最佳本地大小以使其以最高速度运行

  • 我还测试了其他平台上的运行速度,比如飞思卡尔的IMX.6,看起来改变了的尺寸本地工作尺寸根本不起作用!那为什么呢

  • 如果有人知道答案,请帮忙。 非常感谢你

  • 本地大小影响在设备中执行工作的方式。代码使用或不使用
    get\u local\u id()
    都不会影响性能。它只是一个在内核中获取工作id的工具,允许在组中执行一些同步任务
  • 如果您的代码不需要特定的大小(并且不需要)。只需将其设置为默认值,即:
    NULL
  • 通过“反复试验”来改变本地大小不是一条可行之路。在某些情况下可能根本不起作用。本地大小必须遵循一些规则:
    • 总本地大小(乘以所有维度)不能高于设备最大本地大小。(CL_设备最大工作组大小)
    • 尺寸不能高于CL\ U设备\最大\工作\项目\尺寸中指定的尺寸限制
    • 本地工作组大小必须是全局大小的整数除数(在所有维度中)

  • DarkZeros已经提到,您可以将本地工作大小设置为
    null
    ,让OpenCL根据全局工作大小和执行它的设备选择它认为“合适”的大小

    但是,对于某些全局工作大小,OpenCL可能无法选择“合适”的本地工作大小。特别是当全局工作大小是大于最大本地工作大小的素数时。然后可能会强制使用1的本地工作大小。您可以考虑填充您的输入数据,以便它可以很好地分布在几个工作组中。 (我最近在一篇文章中写了几句)

    对于复杂内核,可以考虑查询<代码> CLKNELLIORADIORIGHOLGROUP子集,多个并将计算基础放在这一点上,但是对于这个简单的内核,这是不必要的。 此外,您可能想看看“AMD应用程序内核分析程序”或“NVIDIA占用率计算器”-这些工具可能会为某些目标平台提供一些关于适当配置的提示(不过,最好是编写尽可能通用的代码,只要它不会对性能产生太大的影响)