我需要计算以下矩阵: M = XSX ^ T 和 V = XSy
我想知道的是使用blas的更高效的实现,因为S是维数为n的对称且确定的正矩阵,X具有m行和n列,而y是长度为n的向量。
我的实现如下: 我使用dsymm计算A = XS,然后使用dgemm获得M = AX ^ T,而使用dgemv获得V = Ay。
我认为至少可以用一种更有效的方法来计算M,因为我知道M是对称的并且是肯定的正数。
答案 0 :(得分:1)
您的代码是BLAS可以为您做的最好的事情。没有BLAS操作可以利用M是对称的事实。
您是正确的,尽管从技术上讲,您只需要计算gemm
产品的上对角线部分,然后将严格上对角线部分复制到下对角线部分即可。但这没有常规。
我可以询问尺寸吗?另外,我是否也可以从其他方面获得性能提升的信息:自己构建BLAS实施,与MKL,ACML,OpenBLAS,ATLAS进行比较。您显然可以使用AVX
,FMA
内部函数来编写自己的版本。您应该能够比某些通用库做得更好。另外,浮点变量的精度是多少?
我严重怀疑您自己编写代码可能会收获太多。但是,我绝对建议将所有内容都转换为浮点数,并测试浮点精度是否不能为您提供相同的结果,并显着加快计算时间。我很少看到这种情况,更多是在ODE解决领域和讨厌的函数的数字积分中。
但是您没有解决有关BLAS实施和机器类型的问题。
同样,如果没有更多的技能,则不可能进行超出这一点的优化:(。但是,请不要担心这一点。有一个原因,就是为什么BLAS没有您要求的优化。值得您解决麻烦。
不要忘了使用浮点数而不是加倍。在R上将所有内容转换为float。对于Lapack命令,仅使用sgemX
答案 1 :(得分:0)
在不了解问题详细信息的情况下,识别矩阵中的零可能会很有用。对矩阵进行分区可以实现显着的收益。 M是许多XSX'子矩阵的总和吗?
对于V = XSy,其中y是向量,X和S是矩阵,计算S.y则X.(Sy)应该更好,除非X.S是M的必要计算。