Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/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
Opencl 序列化内核中的工作组项_Opencl - Fatal编程技术网

Opencl 序列化内核中的工作组项

Opencl 序列化内核中的工作组项,opencl,Opencl,我有一个内核,它执行两个任务,a后跟B A在所有工作项上都是并行的,B是顺序的,所以 第一个工作项执行它 如果我能让它们按顺序执行,每个工作项都可以执行B的一部分。 这是一个2D内核,我想让工作项以光栅模式执行 这可能吗?一个想法是所有工作项都可以读取的局部变量,以及唯一的 与变量匹配的工作项将执行并修改变量,以便触发下一个要执行的工作项 关于如何做到这一点,有什么想法/模式吗 谢谢 编辑: 下面是一些关于我的内核当前工作方式的伪代码: void myKernel(void) { //

我有一个内核,它执行两个任务,a后跟B

A在所有工作项上都是并行的,B是顺序的,所以 第一个工作项执行它

如果我能让它们按顺序执行,每个工作项都可以执行B的一部分。 这是一个2D内核,我想让工作项以光栅模式执行

这可能吗?一个想法是所有工作项都可以读取的局部变量,以及唯一的 与变量匹配的工作项将执行并修改变量,以便触发下一个要执行的工作项

关于如何做到这一点,有什么想法/模式吗

谢谢

编辑:

下面是一些关于我的内核当前工作方式的伪代码:

void myKernel(void) {

    // perform A task (all work items are active)

    barrier(CLK_LOCAL_MEMORY_FENCE);

   if (get_local_id(0) == 0 && get_local_id(1) == 0) {
      //perform task B
  }

}
以下是我希望它的工作方式:

// 10 x 10 2D kernel
void myKernel(void) {

    // perform A task (all work items are active)

    barrier(CLK_LOCAL_MEMORY_FENCE);

    local activeIndex =0;
    while (activeIndex < 100) {
        if ( get_local_id(0) + 10* get_local_id(1) == activeIndex) {
             // perform part of task B
             activeIndex++;
        } 
        barrier(CLK_LOCAL_MEMORY_FENCE);
    }
  }
}

编辑2:我在我的HD7700上尝试了这段代码,但速度非常慢。我想我会坚持使用本地内存。

您不能保证所有A工作项都会一起运行;它们可以成批运行。因此,您不能在与A相同的内核中执行B,即使只是一个工作项。如果所有A工作项必须在B启动之前完成,B必须是一个单独的内核,您可以使用对您的问题最有意义的任何全局工作大小来运行它。

您可以在每个工作组的基础上执行所描述的操作。屏障将为您提供所需的功能。如果你想在全球范围内做到这一点,那你就太倒霉了。在恢复内核之前使用变量检查全局状态被称为“自旋锁”,我自己也尝试过一些WSOD白屏死机情况

您发布的示例代码没有任何问题,只是可能缺少参数

void myKernel(void) {

    // perform A task (all work items are active)

    barrier(CLK_LOCAL_MEMORY_FENCE);

   if (get_local_id(0) == 0 && get_local_id(1) == 0) {
      //perform task B
  }

}

你有一些示例代码给我们看吗?你的问题相当含糊。B到底是什么?很多算法可以有效地并行化,即使它并不总是显而易见的。谢谢你,蝉。任务B是一个算术编码器,其中给定像素处的编码器状态取决于前一个像素,等等。因此,它确实无法并行化。谢谢,mfa。我只需要同步工作组中的工作项。我想我会试试看。