2

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

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

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

任何有关如何使用 ArrayFire for Python 执行此类操作的一般提示或资源将不胜感激。

4

1 回答 1

1

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

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

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

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

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

文档中的大多数示例都是用 C++ 编写的,但一般原则也适用于 python 包装器。如果您有特定于 python 包装器的问题,可以在此处发布。

于 2018-01-17T03:44:52.243 回答