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

Concurrency 如何从OpenCL代码启动另一个线程?,concurrency,opencl,gpgpu,gpu,Concurrency,Opencl,Gpgpu,Gpu,我的算法由两个步骤组成: 数据生成。在这一步中,我循环生成数据数组作为函数结果 数据处理。对于这一步,我编写了OpenCL内核,它处理上一步生成的数据数组 现在第一步在CPU上运行,因为它很难并行化。我想在GPU上运行它,因为生成的每一步都需要一些时间。我想立即为已经生成的数据运行第二步 我可以从当前运行的内核在单独的线程中运行另一个opencl内核吗?或者在调用内核的某个线程中运行 一些伪代码可以说明我的观点: __kernel second(__global int * data, int

我的算法由两个步骤组成:

  • 数据生成。在这一步中,我循环生成数据数组作为函数结果
  • 数据处理。对于这一步,我编写了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);
        }
    }
    
    \uuuuu内核秒(\uuuu全局int*数据,int索引){
    //处理数据[i]。此过程需要大量时间
    }
    __内核优先(uu全局整数*数据,常量整数长度){
    for(int i=0;i
    不,OpenCL没有线程的概念,任何一个内核执行都不能启动另一个内核。所有内核执行都是由CPU触发的。

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

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

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

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

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


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

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

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


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

    @Eugene解决方案?将数据写入全局内存,当所有数据写入后,启动处理数据的内核。谢谢,但现在我的程序可以按照你说的那样工作了。我想通过这样一种方式来提高生产率:-)@Eugene变通方案?将数据写入全局内存,当所有数据写入后,启动处理数据的内核。谢谢,但现在我的程序可以按照你说的那样工作了。我想以这样的方式提高生产力:-)