Matrix 在OpenCL中并行执行许多小矩阵操作

Matrix 在OpenCL中并行执行许多小矩阵操作,matrix,opencl,gpgpu,linear-algebra,lapack,Matrix,Opencl,Gpgpu,Linear Algebra,Lapack,我有一个问题,需要我对许多(~4k)小(~3x3)平方厄米矩阵进行特征分解和矩阵乘法。特别是,我需要每个工作项执行一个这样的矩阵的特征分解,然后执行两个矩阵乘法。因此,每个线程必须做的工作非常少,整个作业应该是高度并行的 不幸的是,所有可用的OpenCL Lapack似乎都是用于将大型矩阵上的操作委托给GPU,而不是在OpenCL内核中执行较小的线性代数操作。由于我不希望自己在OpenCL中实现矩阵乘法和任意大小的矩阵,我希望这里的人可能知道适合这项工作的库 我知道OpenCL在某种程度上可能会

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

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


我知道OpenCL在某种程度上可能会得到内置的矩阵操作,因为矩阵类型是这样的,但现在这并没有多大用处。2011年也有一个类似的问题,但它几乎只是说你自己动手,所以我希望从那时起情况有所改善。

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

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

在这种特殊情况下,您可以使用教科书中使用特征多项式的方法找到3x3矩阵的特征值。记住,三次方程有一个相对简单的闭式解:


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

几千次矩阵乘法算不了什么,可能不值得将数据传输到GPU和GPU。我们所说的不到一百万次,您的CPU可以在将矩阵和结果推入PCIe所需的时间内完成这项工作。我对特征分解了解不多,但我怀疑它需要足够长的时间才值得GPGPU-ing。这种特殊的工作负载的优点是只需要很少的GPU输入(完整的矩阵永远不会传输),很少的输出(执行一个缩减步骤,只返回几个数字)。对于某些应用程序,矩阵的数量可能会增长到30k,因此我认为它应该非常适合GPU。这稍微改变了一些情况。如果它们已经在GPU上了,那么将它们转移回去进行小规模的廉价计算就没有多大意义。那就说吧:-)不,那正是我所想的。不幸的是,OpenCL并没有让我在GPU上做矩阵运算变得容易。你有没有任何示例代码,即使是C语言的?这将使您的问题更加具体,甚至可能有助于从许多Stack OpenCL从业者那里获得详细的建议;它们始终是正方形,但可能会变大到8x8,因此通用解决方案会很好。如果可以避免的话,我宁愿不必为每个矩阵大小编写单独的内核。然后编写一个代码生成器,可以为您生成不同的内核。告诉它大小,它会返回您编译和运行的OpenCL内核源代码。对于2x2、3x3和4x4矩阵,如果您有许多矩阵需要并行处理,那么解决方案无疑是使用基于特征多项式根的闭合形式分解。正如Dshallet所建议的,专用实现将比通常的迭代方法快得多,并且更易于并行化。不幸的是,对于5x5或更高版本,这是不可能的,因此,如果尺寸超过该阈值,这里没有一个整洁的解决方案。