【问题标题】:Multiple host threads with ArrayFire使用 ArrayFire 的多个主机线程
【发布时间】:2018-01-11 18:24:41
【问题描述】:

我有一个关于在 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 执行此类操作的一般提示或资源将不胜感激。

【问题讨论】:

    标签: python gpgpu arrayfire


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-19
      • 1970-01-01
      • 1970-01-01
      • 2012-08-30
      • 2017-06-09
      • 2015-12-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多