在OpenCl中并行调用内核?

Vis*_*ngh 0 opencl

以下代码是否并行调用所有4个内核,所有4个事件都将等待它们完成?

    event1 = event2 = event3 = event4 = 0;
    printf("sending enqueue task..\n");
    clEnqueueTask(command_queue, calculate1, 0, NULL, &event1);
    clEnqueueTask(command_queue, calculate2, 0, NULL, &event2);
    clEnqueueTask(command_queue, calculate3, 0, NULL, &event3);
    clEnqueueTask(command_queue, calculate4, 0, NULL, &event4);
    printf("waiting after enquing task..\n");
    clWaitForEvents(1, &event1);
    clWaitForEvents(1, &event2);
    clWaitForEvents(1, &event3);
    clWaitForEvents(1, &event4);
Run Code Online (Sandbox Code Playgroud)

或者,它是执行调用所有内核并行的任务的正确方法吗?它甚至可能吗?我需要查看哪些设备信息才能确认相同内容?

jpr*_*ice 5

如果您使用无序命令队列并且设备支持并行执行多个内核,则这些任务可以并行执行.遗憾的是,您无法执行任何设备信息查询来验证设备是否具有此功能,因此如果要检查是否确实发生了这种情况,则必须检查结果事件的开始/结束时间.实现并行内核执行的另一种方法是使用多个命令队列(如注释中所述).请注意,这种粗粒度的任务并行性在大规模并行体系结构(如GPU)上不会特别有效地执行.

您可以直接调用clFinish(command_queue)等待所有命令完成,而不是单独等待每个事件.您可能还希望clFlush(command_queue)在排队所有任务后立即尝试调用,以确保它们都已提交给设备.

  • @DarkZeros OP正在询问与`clEnqueueTask`的任务并行性,它只启动一个工作项,绝对不会使设备饱和.这就是为什么他们希望并行执行多个内核(任务),哪些CPU和许多最新的GPU支持. (2认同)