以下代码是否并行调用所有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)
或者,它是执行调用所有内核并行的任务的正确方法吗?它甚至可能吗?我需要查看哪些设备信息才能确认相同内容?
如果您使用无序命令队列并且设备支持并行执行多个内核,则这些任务可以并行执行.遗憾的是,您无法执行任何设备信息查询来验证设备是否具有此功能,因此如果要检查是否确实发生了这种情况,则必须检查结果事件的开始/结束时间.实现并行内核执行的另一种方法是使用多个命令队列(如注释中所述).请注意,这种粗粒度的任务并行性在大规模并行体系结构(如GPU)上不会特别有效地执行.
您可以直接调用clFinish(command_queue)等待所有命令完成,而不是单独等待每个事件.您可能还希望clFlush(command_queue)在排队所有任务后立即尝试调用,以确保它们都已提交给设备.
| 归档时间: |
|
| 查看次数: |
559 次 |
| 最近记录: |