在OpenCL中并行执行许多小矩阵运算

时间:2014-01-10 16:10:22

标签: matrix opencl gpgpu linear-algebra lapack

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

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

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

1 个答案:

答案 0 :(得分:5)

一般来说,我对LAPACK,fftw,cuFFT等图书馆的经验是,当你想要做很多像这样的小问题时,最好自己编写自己的性能。这些库通常是为了通用性而编写的,因此您可以经常针对特定的小问题打败它们的性能,特别是如果您可以使用特定问题的独特属性。

我意识到你不想听到“滚动你自己”,但对于这类问题,做IMO真的是最好的事情。您可能会找到一个库来执行此操作,但考虑到真正想要的代码(性能)将不会概括,我怀疑它是否存在。您将专门寻找代码来查找3x3矩阵的特征值。这不是一个库,而是一个带有合适许可证的随机代码片段,你可以操纵它来利用你的特定问题。

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

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