Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/137.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
如何将不同的参数传递给opencl中的不同工作项?_Opencl - Fatal编程技术网

如何将不同的参数传递给opencl中的不同工作项?

如何将不同的参数传递给opencl中的不同工作项?,opencl,Opencl,我是opencl的新手,一直在阅读文档,但我遗漏了一些东西。据我所知,工作组的优点是每个工作人员将为不同的数据执行相同的代码。我一直在阅读文档,但我不知道如何做到这一点。clSetKernelArg似乎正在为所有worker设置内核参数,那么如何在组中的worker上整理数据集,以便每个worker都在处理问题的自己部分?标准方法是传递一个缓冲区,然后让每个工作项根据其id在缓冲区中使用不同的元素 kernel void f(global float* buffer) { int gid

我是opencl的新手,一直在阅读文档,但我遗漏了一些东西。据我所知,工作组的优点是每个工作人员将为不同的数据执行相同的代码。我一直在阅读文档,但我不知道如何做到这一点。clSetKernelArg似乎正在为所有worker设置内核参数,那么如何在组中的worker上整理数据集,以便每个worker都在处理问题的自己部分?

标准方法是传递一个缓冲区,然后让每个工作项根据其id在缓冲区中使用不同的元素

kernel void f(global float* buffer) {
    int gid = get_global_id(0);
    float x = buffer[x];
    // x is different in each work-item.
}

我建议您在深入OpenCL时搜索一些教程和代码示例。

谢谢,我怀疑可能是这种情况,但文档没有明确说明这一点。我的另一个想法是,我可能能够使用全局内存同步(v2.0 atomic,如果可用)并在本地内存中存储索引。你确实让我免于编写大量糟糕的代码。只有一个问题,我可以使用本地ID来达到同样的目的吗?@RalphRitoch我不知道你在使用什么文档,但我建议先查看一些教程/示例。另外,如果我是你,我会避免使用OpenCL2.0的特性,直到至少有一个实现:-)@RalphRitoch关于本地ID,你可以使用它们,但它们有不同的语义!如果有疑问,请使用以下公式:
get\u global\u id(dim)==get\u group\u id(dim)*get\u local\u size(dim)+get\u local\u id(dim)+get\u global\u offset(dim)
。我使用的是来自“Khronos注册表”的OpenCL2.0文档。今天我意识到我的错误,我下载了v1.2。尽管阅读官方规范很痛苦,但我相信从长远来看它会有回报,即使它使我的学习曲线翻两番。