如何从OpenCL代码启动另一个线程?

时间:2011-03-15 09:41:59

标签: concurrency opencl gpu gpgpu gpu-programming

我的算法包括两个步骤:

  1. 数据生成。在这一步中,我在循环中生成数据数组作为一些函数结果
  2. 数据处理。在这一步中,我编写了OpenCL内核,用于处理上一步生成的数据数组。
  3. 现在第一步在CPU上运行,因为很难并行化。我想在GPU上运行它,因为生成的每一步都需要一些时间。我想立即为已经生成的数据运行第二步。

    我可以在分离的线程中从当前运行的内核运行另一个opencl内核吗?或者它在调用内核的某个线程中运行?

    一些伪代码用于说明我的观点:

    __kernel second(__global int * data, int index) {
        //work on data[i]. This process takes a lot of time
    }
    
    __kernel first(__global int * data, const int length) {
        for (int i = 0; i < length; i++) {
            // generate data and store it in data[i]
    
            // This kernel will be launched in some thread that caller or in new thread?
            // If in same thread, there are ways to launch it in separated thread?
            second(data, i);
        }
    }
    

3 个答案:

答案 0 :(得分:3)

不,OpenCL没有线程概念,内核执行也无法启动另一个内核。所有内核执行都由CPU触发。

答案 1 :(得分:3)

你应该启动一个内核。 然后做一个clFInish(); 然后执行下一个内核。

有更有效的方法,但我只会把事情搞得一团糟。

您只需使用第一个内核的内存输出作为第二个内核的输入。这样,你就可以避免CPU-&gt; GPU复制过程。

答案 2 :(得分:0)

我认为全局工作量可能被视为将以某种方式执行的线程数。如果我错了,请纠正我。