我的算法包括两个步骤:
现在第一步在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);
}
}
答案 0 :(得分:3)
不,OpenCL没有线程概念,内核执行也无法启动另一个内核。所有内核执行都由CPU触发。
答案 1 :(得分:3)
你应该启动一个内核。 然后做一个clFInish(); 然后执行下一个内核。
有更有效的方法,但我只会把事情搞得一团糟。
您只需使用第一个内核的内存输出作为第二个内核的输入。这样,你就可以避免CPU-&gt; GPU复制过程。
答案 2 :(得分:0)
我认为全局工作量可能被视为将以某种方式执行的线程数。如果我错了,请纠正我。