我正在使用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();
这是在装有Tesla C2070的计算机上使用MATLAB R2011a +并行计算工具箱的结果:
>> A = rand(1024); gA = gpuArray(A);
% warm up by executing the operations a couple of times, and then:
>> tic, C = A * A; toc
Elapsed time is 0.075396 seconds.
>> tic, gC = gA * gA; toc
Elapsed time is 0.008621 seconds.
MATLAB使用高度优化的库进行矩阵乘法,这就是为什么简单的MATLAB矩阵乘法如此之快的原因。该gpuArray
版本使用MAGMA。
在配备Tesla K20c的计算机上使用R2014a进行更新,以及新功能timeit
和gputimeit
功能:
>> A = rand(1024); gA = gpuArray(A);
>> timeit(@()A*A)
ans =
0.0324
>> gputimeit(@()gA*gA)
ans =
0.0022
在具有16个物理核心和Tesla V100的WIN64计算机上使用R2018b更新:
>> timeit(@()A*A)
ans =
0.0229
>> gputimeit(@()gA*gA)
ans =
4.8019e-04
(注意:在某些时候(我忘记了确切的时间)gpuArray
从MAGMA切换到cuBLAS-gpuArray
尽管MAGMA仍用于某些操作)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句