【发布时间】:2020-10-01 06:24:45
【问题描述】:
我正在使用 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 相同,但 2048 与 1024 有一个巨大的跳跃。
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();
【问题讨论】:
-
可能是你使用哪种算法的问题。
-
确保 Matlab 没有缓存你的结果,它是一个棘手的野兽。首先确保实际正在执行计算,然后进行比较。
-
我确实认为这篇文章真的很有趣,但我真的很想看到更合适的基准。例如,我认为 Matlab R2011a 自动使用多线程,矩阵乘法是使用英特尔的 mkl/blas 库实现的。因此,我猜想如果使用 mkl 调用来进行矩阵乘法,c++ 会更快。那么问题将是 Matlab 的开销是多少。我知道这取决于矩阵乘法的其他细节,但上述数字现在毫无意义。
-
您可以使用运行时间为 O(n^2.81) 的“Strassen 算法”进行大型方阵乘法,这比在 O(n^3) 中运行的本机乘法快约 10 倍。 SSE/AVX 还可以帮助您将代码执行速度提高 8-20 倍。总之,你可以拥有一个比 matlab 更快的 c 实现。
标签: performance matlab matrix matrix-multiplication