我正在尝试比较不同的矩阵乘法方法。 第一种是普通方法:
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/