有很多方法可以提高矩阵-矩阵乘法的性能(例如,使用第二个矩阵的转置来利用引用的局部性,使用像 Strassen 等算法方法)
但是有没有办法提高向量矩阵乘法的性能呢? (即使是谷歌搜索也会重定向到矩阵-矩阵乘法改进方法。)我知道我们可以使用 loop unrolling获得一定程度的性能提升,但还有其他方法吗?
最佳答案
根据定义,矩阵向量乘法是一系列不相关的点积。由于它们不相关,因此可以并行执行。
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执行更多此类微优化,其中一些依赖于非常特定于体系结构的功能。
关于algorithm - 除了使用循环展开之外,还有其他优化向量矩阵乘法的方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35692935/