如何确定AMD OpenCl CPU设备和GPU设备并行运行?

时间:2014-07-21 09:19:00

标签: opencl

我需要在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);

我的问题是,这两项任务是否并行运行?是否有任何探查器/逻辑来检测此类行为?任何提交/逻辑/指针将不胜感激。

2 个答案:

答案 0 :(得分:3)

让我写一个正确的答案:

内核的并行执行取决于所使用的设备/队列模型。 在一般“规范”的观点:

  • 队列按顺序运行作业(不能重叠或并行执行)。除非队列具有“乱序执行”属性,否则可能会出现并行执行和无序执行,并且所有内容都将根据事件进行控制。

但从HW的角度来看:( nVIDIA,AMD等)

  • 设备一次只能运行一个内核。因此,如果队列只能对设备起作用,则队列不能并行处理内核。

在多设备设置中,此约束放宽,内核可以在不同设备中并行运行。但是为了能够完全并行运行,需要满足一些规则:

  • 每个设备的链条应完全分开。内核,队列,内存等(上下文可以是相同的)。
  • 如果必须共享内存,建议对其进行适当的精细控制。写入相同内存的内核可能会阻塞其中一个内存。
  • 如果内核使用另一个内核的输出作为输入,则执行将不是并行的。

为了衡量“实际上”并行执行是否有效,我建议使用事件

您可以通过艰难的方式(手动)进行操作,也可以使用CodeXL,nSight或Intel SDK。他们将通过挂钩OpenCL电话为您收集这些指标,并为您提供所需的洞察力(以非常方便的格式提供数据和统计数据)。

答案 1 :(得分:1)

尽管有关于Command Queue的评论,但仍有一些事情要补充。

您可以使用AMD CodeXL工具收集应用程序时间表&看看任务是否并行完成。或者另一个非常简单的解决方案 - 查看操作系统任务管理器中的CPU负载级别,同时对Catalyst Center中的GPU执行相同操作。如果负载水平同时增加 - 任务并行完成。