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



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

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

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

总的来说,我对LAPACK、fftw、cuFFT等库的经验是,当你想解决很多像这样的小问题时,最好自己编写性能方面的代码。这些库通常是为通用性而编写的,因此您通常可以在特定的小问题上击败它们的性能,尤其是如果您可以使用特定问题的独特属性。

我知道你不想听到"滚自己的",但对于这种类型的问题,这确实是最好的做法。你可能会找到一个库来做这件事,但考虑到你真正想要的代码(为了性能)不会泛化,我怀疑它是否存在。您将专门查找用于查找3x3矩阵的特征值的代码。这不是一个库,而是一个随机的代码片段,有一个合适的许可证,你可以操纵它来利用你的特定问题。

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

虽然我认为这种方法很可能比迭代方法快得多,但如果性能是一个问题,那么最好验证一下。

最新更新