有许多方法可以改善矩阵 - 矩阵乘法的性能(例如,使用第二个矩阵的转置来利用参考的局部性,使用Strassen等算法方法。
但有没有办法提高矢量矩阵乘法的性能? (即使谷歌搜索它也会重定向到矩阵 - 矩阵乘法改进方法。)我知道我们可以使用loop unrolling来获得一些性能提升,但还有其他方法吗?
答案 0 :(得分:2)
根据定义,矩阵向量乘法是一系列不相关的点积。由于它们不相关,因此可以并行执行。
GPU matrix-vector product (gemv)给出了一个非常好的& gem?
操作的不同GPU并行化的详细比较。
与GPU相关的任何内容一样,问题需要足够大才能保证GPU调用的设置开销。据推测,如果矩阵的列维度足够长,即使CPU线程并行化也可以加快速度。
与您撰写的关于循环展开的内容有关。循环展开只是利用计算机体系结构的一些知识,即缓存未命中可以在这里安全地执行无序执行
// Code fragment for calculating the ith product entry.
for(size_t j = 0; j < n, j += 4)
{
sum0 += m[i][j] * v[j];
sum1 += m[i + 1][j] * v[j];
sum2 += m[i + 2][j] * v[j];
sum3 += m[i + 3][j] * v[j];
}
BLAS库,例如OpenBLAS执行更多此类微优化,其中一些依赖于特定于体系结构的特性。
答案 1 :(得分:1)
在过去,我使用的是比二维矩阵更快访问的1维矩阵。它们也不是那么难用,您可以使用以下内容访问每个元素:
int i, j;
for (i = 0; i < COLUMN_LENGTH; i++)
{
for (j = 0; j < ROW_LENGTH; j++)
{
printf("%f\n", A[i * ROW_LENGTH + j]);
}
}
这是针对行主要有序矩阵。
数学库LAPACK可以在您的应用程序中使用,矩阵函数已针对各种体系结构进行了高度调整。否则,您可以阅读源代码,这可能会为您自己的优化提供一些想法。
答案 2 :(得分:0)
我认为通用的解决方案并不存在。但是我们可以通过快速存储器用于向量,高速缓冲存储器属性等来关注计算装置的具体特征来加速计算。