algorithm - 除了使用循环展开之外,还有其他优化向量矩阵乘法的方法吗?

标签 algorithm performance optimization matrix

有很多方法可以提高矩阵-矩阵乘法的性能(例如,使用第二个矩阵的转置来利用引用的局部性,使用像 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/

相关文章:

c++ - OpenCV/C++ 中的 MATLAB sub2ind/ind2sub

python - 计算pyspark中两个数据帧的行之间的距离

scala - 为什么 Scala 初始化元组数组很慢?

sql - AST 与后缀算法

php - 内容更改时从头开始重新创建 index.html

c - 优化循环中的函数指针检查

c# - 算法 - 在 C# 中初始化一个随机数组

c - 在循环排序数组中找到最小元素

algorithm - Cube on Cube 碰撞检测算法?

java - Lambda 表达式 Java 转换