【问题标题】:How to launch another thread from OpenCL code?如何从 OpenCL 代码启动另一个线程?
【发布时间】:2011-05-25 22:52:44
【问题描述】:

我的算法包括两个步骤:

  1. 数据生成。在这一步中,我循环生成数据数组作为一些函数结果
  2. 数据处理。对于这一步,我编写了 OpenCL 内核,它处理上一步生成的数据数组。

现在第一步在 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);
    }
}

【问题讨论】:

    标签: concurrency opencl gpgpu gpu


    【解决方案1】:

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

    【讨论】:

    • @Eugene 解决方法?将数据写入全局内存,当所有数据写入后,启动处理数据的内核。
    • 谢谢你,但现在我的程序按你说的工作了。我想以这种方式提高生产力:-)
    【解决方案2】:

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

    有更有效的方法,但我只会用事件来搞砸你。

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

    【讨论】:

      【解决方案3】:

      我相信全局工作大小可能被视为将以一种或另一种方式执行的线程数。如果我错了,请纠正我。

      【讨论】:

        猜你喜欢
        • 2016-10-01
        • 2016-11-21
        • 2019-01-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-22
        相关资源
        最近更新 更多