【发布时间】:2014-06-19 19:44:48
【问题描述】:
在 OpenCl 中迭代一组内核的最有效方法是什么。所以伪代码是
for i : max {
<kernel 1>
<kernel 2>
<kernel 3>
}
我是否只需要遍历这个函数来创建一个长命令队列,或者我可以在完成后动态加载内核吗? (P.s 内核都必须共享一些全局数据)。
山姆
【问题讨论】:
在 OpenCl 中迭代一组内核的最有效方法是什么。所以伪代码是
for i : max {
<kernel 1>
<kernel 2>
<kernel 3>
}
我是否只需要遍历这个函数来创建一个长命令队列,或者我可以在完成后动态加载内核吗? (P.s 内核都必须共享一些全局数据)。
山姆
【问题讨论】:
最简单的方法是使用有序命令队列并将内核按所需顺序推送到它:
// Creating in-order command queue (default case).
cl_command_queue queue = clCreateCommandQueue(...);
// Just for test
std::vector<cl_kernel> kernels;
const int num_kernels = 12;
for(int i=0; i<num_kernels; i++){
kernels.push_back(clCreateKernel(...));
}
for(cl_kernel &kernel : kernels){
clEnqueueNDRangeKernel(queue, kernel,...);
}
/* Kernels execution tasks are issued on Device all at once.
* Execution order is same to order of enqueue, as Queue is in-order.*/
clFlush(queue);
【讨论】: