我正在使用 CUDA、C++、C#、Java 进行一些基准测试,并使用 MATLAB 进行验证和矩阵生成。当我使用 MATLAB 执行矩阵乘法时,2048x2048甚至更大的矩阵几乎立即相乘。
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.
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 + Parallel Computing Toolbox的结果:
>> 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。
gpuArray
*在装有 Tesla K20c 的机器上 *使用 R2014a 进行更新timeit,新功能和gputimeit功能:
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 - MAGMA 仍然用于某些gpuArray操作)
*在具有 32 个物理内核和 A100 GPU 的 WIN64 机器上 *使用 R2022a 进行更新:
>> timeit(@()A*A) ans = 0.0076 >> gputimeit(@()gA*gA) ans = 2.5344e-04