OpenCL - GPU 上的多线程

OpenCL - multiple threads on a gpu

在通过 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任务完成的同时并行执行另一个任务?

您是否愿意推荐一些示例供参考?

谢谢!

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

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

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

有关 GPU 上的并行化如何工作的更多详细信息,请参阅