我正在使用CUDA、C++、C#、Java进行一些基准测试,并使用MATLAB进行验证和矩阵生成。当我用MATLAB执行矩阵乘法时,2048x2048
和更大的矩阵几乎可以立即相乘。
1024x1024 2048x2048 4096x4096
--------- --------- ---------
CUDA C (ms) 43.11 391.05 3407.99
C++ (ms) 6137.10 64369.29 551390.93
C# (ms) 10509.00 300684.00 2527250.00
Java (ms) 9149.90 92562.28 838357.94
MATLAB (ms) 75.01 423.10 3133.90
只有CUDA是有竞争力的,但我认为至少C++会有点接近,而不是慢60倍。我也不知道如何看待C#的结果。这个算法和C++和Java是一样的,但是1024
有一个巨大的跳跃2048
。
MATLAB的矩阵乘法运算是怎么这么快的?
C++代码:
float temp = 0;
timer.start();
for(int j = 0; j < rozmer; j++)
{
for (int k = 0; k < rozmer; k++)
{
temp = 0;
for (int m = 0; m < rozmer; m++)
{
temp = temp + matice1[j][m] * matice2[m][k];
}
matice3[j][k] = temp;
}
}
timer.stop();
发布于 2011-05-20 04:58:27
This is why。MATLAB不会像在C++代码中那样,通过循环遍历每个元素来执行简单的矩阵乘法。
当然,我假设您只是使用了C=A*B
,而不是自己编写乘法函数。
发布于 2011-05-19 23:50:20
Matlab在一段时间前加入了LAPACK,所以我认为他们的矩阵乘法至少使用了那么快的速度。LAPACK源代码和文档随处可见。
你也可以在http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.140.1785&rep=rep1&type=pdf上看看后藤健二和范德盖恩的论文“高性能矩阵乘法的剖析”
发布于 2012-11-05 00:30:02
在做矩阵乘法时,你使用的是朴素的乘法方法,这会占用O(n^3)
的时间。
存在采用O(n^2.4)
的矩阵乘法算法。这意味着在n=2000
中,您的算法所需的计算量是最佳算法的100倍。
你真的应该查看维基百科的矩阵乘法页面,了解更多关于实现矩阵乘法的有效方法的信息。
https://stackoverflow.com/questions/6058139
复制相似问题