c - C 中的优化矩阵乘法

标签 c matrix

我正在尝试比较不同的矩阵乘法方法。 第一种是普通方法:

do
{
    for (j = 0; j < i; j++)
    {
        for (k = 0; k < i; k++)
        {
            suma = 0;
            for (l = 0; l < i; l++)
                suma += MatrixA[j][l]*MatrixB[l][k];
                MatrixR[j][k] = suma;
            }
        }
    }
    c++;
} while (c<iteraciones);

第二个包括先转置矩阵 B,然后按行进行乘法:

int f, co;
for (f = 0; f < i; f++) {
    for ( co = 0; co < i; co++) {
        MatrixB[f][co] = MatrixB[co][f];
    }
}

c = 0;
do
{
    for (j = 0; j < i; j++)
    {
        for (k = 0; k < i; k++)
        {
            suma = 0;
            for (l = 0; l < i; l++)
                suma += MatrixA[j][l]*MatrixB[k][l];
                MatrixR[j][k] = suma;
            }
        }
     }
     c++;
} while (c<iteraciones);

第二种方法应该快得多,因为我们正在访问连续的内存插槽,但我没有在性能上获得显着改进。我做错了什么吗?

我可以发布完整的代码,但我认为不需要。

最佳答案

What Every Programmer Should Know About Memory (pdf 链接)由 Ulrich Drepper 提供,有很多关于内存效率的好主意,但特别是,他使用矩阵乘法作为示例,说明了解内存和使用该知识如何可以加快此过程。查看他论文中的附录 A.1,并通读第 6.2.1 节。论文中的表 6.2 显示,对于 1000x1000 矩阵,他可以将运行时间缩短为原始实现时间的 10%。

诚然,他的最终代码非常复杂并且使用了很多系统特定的东西和编译时调整,但是,如果您真的需要速度,阅读那篇论文和阅读他的实现是绝对值得。

关于c - C 中的优化矩阵乘法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1907557/

相关文章:

java - 使用坐标存储系统创建稀疏矩阵?

python - NetworkX:邻接矩阵与图不对应

matlab - Matlab中获取度量矩阵的简单方法

c - 需要一些关于 C 中树的解释

c++ - 矩阵模板类中的重载运算符* =和Operator +

c - 如何在 C 中的矩阵(二维数组)内声明 double ?

c++ - 用于捕获 C++ group/dynsym 部分的 GNU LD 脚本

ios - 在iOS上使用OpenGL-ES 2.0设置横向投影的正确方法是什么?

c - 从命令行将输出重定向到 C 中的文本文件

c++ - 如何防止 SIGPIPE 或防止服务器结束?