Concurrency 如何从OpenCL代码启动另一个线程?
我的算法由两个步骤组成:Concurrency 如何从OpenCL代码启动另一个线程?,concurrency,opencl,gpgpu,gpu,Concurrency,Opencl,Gpgpu,Gpu,我的算法由两个步骤组成: 数据生成。在这一步中,我循环生成数据数组作为函数结果 数据处理。对于这一步,我编写了OpenCL内核,它处理上一步生成的数据数组 现在第一步在CPU上运行,因为它很难并行化。我想在GPU上运行它,因为生成的每一步都需要一些时间。我想立即为已经生成的数据运行第二步 我可以从当前运行的内核在单独的线程中运行另一个opencl内核吗?或者在调用内核的某个线程中运行 一些伪代码可以说明我的观点: __kernel second(__global int * data, int
__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变通方案?将数据写入全局内存,当所有数据写入后,启动处理数据的内核。谢谢,但现在我的程序可以按照你说的那样工作了。我想以这样的方式提高生产力:-)