【问题标题】:OpenCL - multiple threads on a gpuOpenCL - gpu上的多个线程
【发布时间】:2020-09-09 15:19:00
【问题描述】:

在通过 OpenMP 并行化 C++ 代码之后,我现在正在考虑使用 GPU(Radeon Pro Vega II)来加速我的代码的特定部分。作为一名 OpenCL 新手,我目前正在寻找可以向我展示如何实现多核 CPU - GPU 交互的示例。

这就是我想要实现的目标。假设有一个固定的短长度数组,例如 {1,2,3,4,5},作为练习,您想要计算该数组所有可能的“右移”,即

{5,1,2,3,4}
{4,5,1,2,3}
{3,4,5,1,2}
{2,3,4,5,1}
{1,2,3,4,5}

.

相关的 OpenCL 代码非常简单。

现在,假设您的 CPU 有许多内核,例如 56 个内核,每个内核都有不同的起始阵列,并且在任何随机时刻,每个 CPU 内核都可能要求 GPU 计算其自己阵列的右移。这个核心,比如核心 21,应该将它自己的数组复制到 GPU 内存中,运行内核,然后等待结果。我的问题是“在这个操作过程中,其他CPU核心是否可以提交类似的请求,而无需等待核心21提交的任务完成?”

另外,核心 21 可以在等待 GPU 任务完成的同时并行执行另一个任务吗?

你想推荐一些例子吗?

谢谢!

【问题讨论】:

    标签: c++ macos openmp opencl gpgpu


    【解决方案1】:

    GPU 与内核调用队列和 (PCIe-) 内存传输一起工作。在这个队列中,它可以同时处理非阻塞内存传输和一个内核,但不能同时处理两个连续的内核。你可以做几个队列(每个 CPU 内核一个),然后来自不同队列的内核可以并行执行,前提是每个内核只占用一小部分 GPU 资源。 CPU 内核可以在 GPU 上执行队列时执行不同的任务,并且使用命令 queue.finish() CPU 将等待 GPU 完成。

    但是,让多个 CPU 将任务发送到单个 GPU 是一种不好的做法,并且不会给您带来任何性能优势,同时会使您的代码过于复杂。每个小的 PCIe 内存传输都有很大的延迟开销,并且没有使 GPU 充分饱和的小内核性能很差。 多 CPU 方法仅在每个 CPU 将任务发送到其自己的专用 GPU 时才有用,即便如此,如果您的单个 GPU 的 VRAM 不够,或者如果您希望拥有比单个 GPU 更多的并行吞吐量,我只会推荐这种方法允许。

    更好的策略是为 GPU 提供单个 CPU 内核,并且 - 如果在 CPU 端有一些处理要做 - 只有在多个 CPU 内核之间进行并行处理。通过将小数据包组合到单个大 PCIe 内存传输和大内核中,您将使硬件饱和并获得最佳性能。

    有关 GPU 上的并行化如何工作的更多详细信息,请参阅https://stackoverflow.com/a/61652001/9178992

    【讨论】:

      猜你喜欢
      • 2018-05-27
      • 2017-03-11
      • 1970-01-01
      • 2012-04-24
      • 2011-05-24
      • 1970-01-01
      • 1970-01-01
      • 2016-03-22
      • 2020-03-24
      相关资源
      最近更新 更多