ArrayFire 的多个主机线程

Multiple host threads with ArrayFire

我有一个关于在 Python 中使用 ArrayFire 的多个主机线程的新手问题。我们目前有一个高度并行的 CPU-only 代码,使用 Open MPI 和 mpi4py 并行化。每个 CPU 线程执行大型矩阵乘法,通常有多个线程同时进行乘法。我们希望通过使用 ArrayFire 在单个 GPU 上执行矩阵乘法来提高性能。

我想弄清楚我们是否可以让多个 CPU 主机线程向 GPU 发送矩阵乘法作业,并让 GPU 同时执行这些乘法。或者,每个 CPU 主机线程是否必须等到 GPU 空闲才能向 GPU 发送乘法作业?

我很难找到答案,因为我不精通 GPU 计算语言。我的印象是某些 GPU 支持并发内核执行,但我无法确定我们的 GPU (Radeon Vega 10) 是否支持。

任何关于如何使用 ArrayFire 为 Python 做这样的事情的一般提示或资源将不胜感激。

矩阵乘法在 GPU 上非常快。切换到 GPU 来进行矩阵数学运算通常是一个不错的决定。我会按顺序回答你的问题。请注意,我在这里所说的大部分内容都适用于 AMD 和 NVIDIA GPU。

是的,您可以启动多个主机线程,这些线程可以使同一内核的多个实例入队,而无需等待先前的作业完成。所有内核启动本质上都是异步的,因此将内核排队到设备不会阻止执行。所有内核启动都将排队等待将来在 GPU 上执行。现在,问题是所有这些内核是否会同时执行——这完全取决于单个内核实例所需的资源。如果 GPU 可以同时容纳两个内核执行,那么它会自动为您完成。确定这一点的内核启动所需的资源类型是启动的块数、共享内存、常量内存等。

并发内核执行完全取决于单个内核实例需要多少资源。此外,每个内核实例都必须在单独的队列(OpenCL 队列)上启动,因为所有排队到同一队列的内核都按顺序执行。

要有效地使用 ArrayFire,我建议您阅读列出的教程 here。要设置可以在单独队列上启动每个内核的多线程解决方案,您可能必须专注于教程的以下两部分,尤其是第二部分。

  1. 数组和矩阵操作
  2. OpenCL 互操作性

文档中的大部分示例都是用 C++ 编写的,但一般原则也适用于 python 包装器。如果您有特定于 python 包装器的问题,您可以 post here.