【问题标题】:How to determine AMD OpenCl CPU Device and GPU Devices are running parallel?如何确定 AMD OpenCl CPU 设备和 GPU 设备并行运行?
【发布时间】:2014-09-11 17:57:42
【问题描述】:

我有四个作业(分为两个任务)需要在 AMD OpenCl 设备和 GPU 设备上并行执行。据我所知,如果通过了 NULL 事件,则为 AMD OpenCl CPU 设备调用 NDRangeKernel 会立即返回(非阻塞)。

任务1 因此,首先我为 AMD OpenCl CPU 设备调用 NDRangeKernel,为 job1 调用 NDRangeKernel,之后主机将立即获得控制权。

ret = clEnqueueNDRangeKernel(command_queue_amd, icm_kernel_amd, 1, NULL, &glob, &local, 0, NULL, NULL);

任务2 然后主机可以为 GPU 设备调用 NDRangeKernel,使用 gpu 内核 1 调用 job2,然后调用 gpu 内核 2 调用 job3,然后调用 gpu 内核 3 调用 job4。

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

我的问题是,这两个任务是否并行运行?是否有任何探查器/逻辑来检测这种行为?任何评论/逻辑/指针将不胜感激。

【问题讨论】:

  • 你怎么知道他们没有及时返回?该调用需要一些时间来完成排队过程,但这并不意味着它是一个阻塞调用。您应该在通话后检查通话事件以查看其状态。顺便说一句:内核永远不会在设备中并行运行,只有内核调用中的 WI 并行运行。
  • 是的 @DarkZeros 内核从不并行运行。但这适用于不同的设备吗?就我而言,设备是不同的。我对 GPU 设备也有同样的期待,但我只是建议 AMD OpenCL 设备与 1 个内核分开,而 GPU 设备与 3 个内核分开运行?因此我的查询是,两个设备是否都在并行执行?
  • 您在所有 GPU 案例中使用相同的队列 @9​​87654324@,因此,无论您启动 1、3 还是 1k 内核,它们都将是串行的。至于 CPU 和 GPU 设备,是的,它们确实并行运行(通过查看事件数据来检查)。
  • 这回答了我的问题。请将其发布在答案栏中,以便我标记它。

标签: opencl


【解决方案1】:

让我写一个正确的答案:

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

  • 队列按顺序运行作业(不能重叠或并行执行)。除非队列有“out-of-order-exec”的属性,这种情况下并行执行和无序执行都是可能的,一切都将根据事件进行控制。

但从硬件的角度来看:(nVIDIA、AMD 等)

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

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

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

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

您可以通过艰难的方式(手动)完成,也可以使用 CodeXL、nSight 或英特尔 SDK。他们将通过挂钩 OpenCL 调用为您收集这些指标,并为您提供所需的洞察力(以非常方便的格式,包含数字和统计数据)。

【讨论】:

  • 感谢 DarkZeros。帮了大忙。
  • 设备可以选择一次运行多个内核。
  • 你能详细说明一下怎么做吗?据我所知,硬件不允许这种情况发生。
  • 最新一代的 AMD 和 Nvidia 显卡支持并发内核执行(Nvidia 最多支持 16 个并行内核)。 CPU 设备支持它很长时间(例如通过裂变)。
【解决方案2】:

虽然对命令队列进行了评论,但还有一些东西要补充。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-16
    • 1970-01-01
    • 2013-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多