我需要在AMD OpenCl设备和GPU设备上并行执行四个作业(分为两个任务)。据我所知,如果传递NULL事件,则为AMD OpenCl CPU设备调用NDRangeKernel会立即返回(非阻塞)。
TASK1 因此,首先我使用NDRangeKernel为job1调用NDRangeKernel用于AMD OpenCl CPU设备,之后主机将立即拥有控件。
ret = clEnqueueNDRangeKernel(command_queue_amd, icm_kernel_amd, 1, NULL, &glob, &local, 0, NULL, NULL);
TASK2 然后主机可以使用gpu内核1为job2调用NDRangeKernel for GPU Device,然后为job3调用gpu内核2,然后为job4调用gpu内核3,它将串行调用它们。
ret = clEnqueueNDRangeKernel(command_queue_gpu, icm_kernel_gpu[0], 1, NULL, &glob, &local, 0, NULL, NULL);
ret = clEnqueueNDRangeKernel(command_queue_gpu, icm_kernel_gpu[1], 1, NULL, &glob, &local, 0, NULL, NULL);
ret = clEnqueueNDRangeKernel(command_queue_gpu, icm_kernel_gpu[2], 1, NULL, &glob, &local, 0, NULL, NULL);
他们没有立即返回主持人。
然后读取GPU的缓冲区,然后读取CPU。
ret = clEnqueueReadBuffer(command_queue_gpu, Buffer_gpu, CL_TRUE, 0, count * sizeof(double), arr_gpu, 0, NULL, NULL);
ret = clEnqueueReadBuffer(command_queue_amd, Buffer_amd, CL_TRUE, 0, count * sizeof(double), arr_cpu, 0, NULL, NULL);
我的问题是,这两项任务是否并行运行?是否有任何探查器/逻辑来检测此类行为?任何提交/逻辑/指针将不胜感激。
答案 0 :(得分:3)
让我写一个正确的答案:
内核的并行执行取决于所使用的设备/队列模型。 在一般“规范”的观点:
但从HW的角度来看:( nVIDIA,AMD等)
在多设备设置中,此约束放宽,内核可以在不同设备中并行运行。但是为了能够完全并行运行,需要满足一些规则:
为了衡量“实际上”并行执行是否有效,我建议使用事件。
您可以通过艰难的方式(手动)进行操作,也可以使用CodeXL,nSight或Intel SDK。他们将通过挂钩OpenCL电话为您收集这些指标,并为您提供所需的洞察力(以非常方便的格式提供数据和统计数据)。
答案 1 :(得分:1)
尽管有关于Command Queue的评论,但仍有一些事情要补充。
您可以使用AMD CodeXL工具收集应用程序时间表&看看任务是否并行完成。或者另一个非常简单的解决方案 - 查看操作系统任务管理器中的CPU负载级别,同时对Catalyst Center中的GPU执行相同操作。如果负载水平同时增加 - 任务并行完成。