小编典典

为什么 MATLAB 的矩阵乘法速度如此之快?

all

我正在使用 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();

阅读 141

收藏
2022-07-07

共1个答案

小编典典

这是我在装有 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

*在装有 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 - MAGMA 仍然用于某些gpuArray操作)

*在具有 32 个物理内核和 A100 GPU 的 WIN64 机器上 *使用 R2022a 进行更新:

>> timeit(@()A*A)
ans =
    0.0076
>> gputimeit(@()gA*gA)
ans =
   2.5344e-04
2022-07-07