【问题标题】:Performing many small matrix operations in parallel in OpenCL在 OpenCL 中并行执行许多小矩阵运算
【发布时间】:2014-01-10 16:10:21
【问题描述】:

我有一个问题需要我对许多 (~4k) 小 (~3x3) 方 Hermitian 矩阵进行特征分解和矩阵乘法。特别是,我需要每个工作项执行一个这样的矩阵的特征分解,然后执行两个矩阵乘法。因此,每个线程必须做的工作相当少,而且整个工作应该是高度可并行化的。

不幸的是,似乎所有可用的 OpenCL LAPACK 都用于将大型矩阵上的运算委托给 GPU,而不是用于在 OpenCL 内核中进行较小的线性代数运算。由于我不想自己在 OpenCL 中为任意大小的矩阵实现矩阵乘法和eigendecomposition,所以我希望这里有人可能知道适合这项工作的库?

我知道自从矩阵类型is reserved 以来,OpenCL 可能会在某个时候获得内置矩阵运算,但现在这并没有多大用处。 2011 年有一个类似的问题here,但它几乎只是说自己动手,所以我希望从那时起情况有所改善。

【问题讨论】:

  • 几千个矩阵乘法算不了什么,可能不值得将数据传输到 GPU 并返回。我们谈论的是少于一百万次 FLOP,您的 CPU 可以在将矩阵和结果推送到 PCIe 所需的时间内做到这一点。我对特征分解了解不多,但我怀疑它需要足够长的时间才能值得 GPGPU-ing。
  • 这种特殊工作负载的优点是需要很少的 GPU 输入(从不传输完整的矩阵)和很少的输出(执行缩减步骤,只返回几个数字) .对于某些应用程序,矩阵的数量可能会增加到 30k,因此我认为它应该非常适合 GPU。
  • 这有点改变。如果它们已经在 GPU 上,那么将它们返回 以进行小型廉价计算并没有多大意义。那就去吧:-)
  • 不,这正是我的想法。不幸的是,OpenCL 并没有让我在 GPU 上进行矩阵运算变得容易。
  • 你有任何示例代码,即使只是在 C 中?这将使您的问题更加具体,甚至可能有助于从许多 Stack OpenCL 从业者那里产生详细的建议。

标签: matrix opencl gpgpu linear-algebra lapack


【解决方案1】:

总的来说,我对 LAPACK、fftw、cuFFT 等库的经验是,当您想要解决许多像这样的非常小的问题时,最好自己编写以提高性能。这些库通常是为了通用性而编写的,因此您通常可以在特定的小问题上超越它们的性能,特别是如果您可以使用特定问题的独特属性。

我知道您不想听到“自己动手”,但对于此类问题,IMO 确实是最好的选择。您可能找到一个库来执行此操作,但考虑到您真正想要的代码(为了性能)不会泛化,我怀疑它是否存在。您将专门寻找代码来查找 3x3 矩阵的特征值。这与其说是一个库,不如说是一个带有合适许可证的随机代码 sn-p,您可以对其进行操作以利用您的特定问题。

在这种特定情况下,您可以通过使用特征多项式的教科书方法找到 3x3 矩阵的特征值。请记住,三次方程有一个相对简单的封闭形式解:http://en.wikipedia.org/wiki/Cubic_function#General_formula_for_roots

虽然我认为这种方法很可能比迭代方法快得多,但明智的做法是验证性能是否存在问题。

【讨论】:

  • 我担心矩阵并不总是 3x3;它们总是正方形的,但可能会变得像 8x8 一样大,所以一个通用的解决方案会很好。如果可以避免的话,我宁愿不必为每个矩阵大小编写单独的内核。
  • 然后编写一个代码生成器,可以为你制作不同的内核。告诉它大小,它会返回您编译和运行的 OpenCL 内核源代码。
  • 对于 2x2、3x3 和 4x4 矩阵,如果要并行处理很多矩阵,则解决方案无疑是使用基于特征多项式根的封闭式分解。正如 dsharlet 所暗示的,专用实现将比通常的迭代方法快得多,并且更适合并行化。不幸的是,这对于 5x5 及以上是不可能的,因此如果尺寸超过该阈值,这里就没有一个整洁的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-27
  • 2019-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多