我有一个新手问题,关于在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 做这样的事情的任何一般提示或资源将不胜感激。
矩阵乘法在 GPU 上非常快。切换到 GPU 进行矩阵数学通常是一个不错的决定。我将按顺序回答你的问题。请注意,我在这里所说的大部分内容都适用于AMD和NVIDIA GPU。
是的,您可以启动多个主机线程,这些线程可以将同一内核的多个实例排队,而无需等待上一个作业完成。所有内核启动本质上都是异步的,因此将内核排队到设备不会阻止执行。所有内核启动都将排队等待将来在 GPU 上执行。现在,问题是所有这些内核是否会并发执行 - 这完全取决于单个内核实例所需的资源。如果 GPU 可以同时容纳两个内核执行,那么它会自动为您执行此操作。内核启动所需的确定这一点的资源类型是启动的块数、共享内存、常量内存等。
并发内核执行完全取决于单个内核实例需要多少资源。此外,每个内核实例都必须在单独的队列(OpenCL 队列)上启动,因为排队到同一队列的所有内核都按顺序执行。
为了有效地使用ArrayFire,我建议您阅读此处列出的教程。要设置多线程解决方案,您可以在单独的队列上启动每个内核,您可能需要专注于教程的以下两个部分,尤其是第二个部分。
- 数组和矩阵操作
- OpenCL 互操作性
文档中的大多数示例都是C++的,但一般原则也适用于 python 包装器。如果您有特定于 python 包装器的问题,可以在此处发布。