除了使用循环展开之外,有没有办法优化矢量矩阵乘法?

时间:2016-02-29 06:04:46

标签: algorithm performance optimization matrix

有许多方法可以改善矩阵 - 矩阵乘法的性能(例如,使用第二个矩阵的转置来利用参考的局部性,使用Strassen等算法方法。

但有没有办法提高矢量矩阵乘法的性能? (即使谷歌搜索它也会重定向到矩阵 - 矩阵乘法改进方法。)我知道我们可以使用loop unrolling来获得一些性能提升,但还有其他方法吗?

3 个答案:

答案 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)

我认为通用的解决方案并不存在。但是我们可以通过快速存储器用于向量,高速缓冲存储器属性等来关注计算装置的具体特征来加速计算。