【问题标题】:Iterate OpenCl Kernels迭代 OpenCl 内核
【发布时间】:2014-06-19 19:44:48
【问题描述】:

在 OpenCl 中迭代一组内核的最有效方法是什么。所以伪代码是

for i : max {
    <kernel 1>
    <kernel 2>
    <kernel 3>
}

我是否只需要遍历这个函数来创建一个长命令队列,或者我可以在完成后动态加载内核吗? (P.s 内核都必须共享一些全局数据)。

山姆

【问题讨论】:

    标签: c++ c opencl gpu


    【解决方案1】:

    最简单的方法是使用有序命令队列并将内核按所需顺序推送到它:

    // 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);
    

    【讨论】:

    • 作为注释,您也可以使用事件将您的内核链接到使用此样式的依赖项列表中。这样你就可以使用一个乱序队列并且仍然一次推送整个列表。
    猜你喜欢
    • 1970-01-01
    • 2011-12-06
    • 2012-09-01
    • 2016-11-16
    • 1970-01-01
    • 2016-01-17
    • 2018-02-08
    • 2013-04-24
    • 2013-05-01
    相关资源
    最近更新 更多