196 votes

Pourquoi MATLAB est-il si rapide dans la multiplication de matrices ?

Je réalise quelques benchmarks avec CUDA, C++, C#, Java, et j'utilise MATLAB pour la vérification et la génération de matrices. Lorsque j'effectue une multiplication de matrice avec MATLAB, 2048x2048 et des matrices encore plus grandes sont presque instantanément multipliées.

             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

Seul CUDA est compétitif, mais je pensais qu'au moins le C++ serait assez proche et pas 60 fois plus lent. Je ne sais pas non plus quoi penser des résultats du C#. L'algorithme est le même que celui du C++ et de Java, mais il y a un saut énorme. 2048 de 1024 .

Comment MATLAB peut-il effectuer une multiplication matricielle aussi rapidement ?

Code 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();

14 votes

C'est probablement une question d'algorithme que vous utilisez.

25 votes

Assurez-vous que Matlab ne met pas en cache votre résultat, c'est une bête délicate. Assurez-vous d'abord que le calcul est bien effectué, puis comparez.

28 votes

92voto

Edric Points 11387

Voici mes résultats en utilisant MATLAB R2011a + Boîte à outils pour le calcul parallèle sur une machine avec un Tesla C2070 :

>> 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 utilise des bibliothèques hautement optimisées pour la multiplication des matrices, ce qui explique pourquoi la multiplication des matrices de MATLAB est si rapide. Le site gpuArray La version utilise MAGMA .

Mise à jour avec R2014a sur une machine avec un Tesla K20c, et la nouvelle timeit et gputimeit fonctions :

>> A = rand(1024); gA = gpuArray(A);
>> timeit(@()A*A)
ans =
    0.0324
>> gputimeit(@()gA*gA)
ans =
    0.0022

Mise à jour avec R2018b sur une machine WIN64 avec 16 cœurs physiques et un Tesla V100 :

>> timeit(@()A*A)
ans =
    0.0229
>> gputimeit(@()gA*gA)
ans =
   4.8019e-04

(NB : à un moment donné (j'ai oublié quand exactement) gpuArray est passé de MAGMA à cuBLAS - MAGMA est toujours utilisé pour certaines applications. gpuArray mais pas les opérations)

0 votes

Pourquoi cela est-il important ?

0 votes

Pourquoi ce qui est important ? J'essayais de donner un aperçu des bibliothèques utilisées par MATLAB dans diverses situations pour expliquer pourquoi les performances de MATLAB sont bonnes, c'est-à-dire parce qu'il utilise des bibliothèques numériques hautement optimisées.

0 votes

Wow, merci d'avoir mis à jour ce site au fil des ans !

42voto

Doug Stephen Points 3913

C'est pourquoi . MATLAB n'effectue pas une multiplication matricielle naïve en bouclant sur chaque élément comme vous l'avez fait dans votre code C++.

Bien sûr, je suppose que vous venez d'utiliser C=A*B au lieu d'écrire vous-même une fonction de multiplication.

20voto

Jonathan Moore Points 341

Matlab a intégré LAPACK il y a quelque temps, je suppose donc que leur multiplication matricielle utilise quelque chose d'au moins aussi rapide. Le code source et la documentation de LAPACK sont facilement disponibles.

Vous pouvez également consulter l'article de Goto et Van De Geijn intitulé " Anatomy of High-Performance Matrix Multiplication" à l'adresse http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.140.1785&rep=rep1&type=pdf

7 votes

MATLAB utilise la bibliothèque MKL d'Intel qui fournit une implémentation optimisée des routines BLAS/LAPACK : stackoverflow.com/a/16723946/97160

9voto

Jouni Osmala Points 59

Lors de la multiplication de matrices, vous utilisez la méthode de multiplication naïve qui prend du temps de O(n^3) .

Il existe un algorithme de multiplication de matrice qui prend O(n^2.4) . Ce qui signifie qu'à n=2000 votre algorithme nécessite ~100 fois plus de calculs que le meilleur algorithme.
Vous devriez vraiment consulter la page wikipedia sur la multiplication matricielle pour obtenir de plus amples informations sur les moyens efficaces de la mettre en œuvre.

0 votes

Et MATLAB utilise probablement un tel algorithme puisque le temps de multiplication d'une matrice 1024*1024 est inférieur à 8 fois le temps de multiplication d'une matrice 2048*2048 ! Bien joué les gars de MATLAB.

5 votes

Je doute plutôt qu'ils utilisent les algorithmes de multiplication "efficaces", malgré leurs avantages théoriques. Même l'algorithme de Strassen présente des difficultés d'implémentation, et l'algorithme de Coppersmith-Winograd, dont vous avez probablement entendu parler, est tout simplement n'est pas pratique (en ce moment). Aussi, un fil de SO connexe : stackoverflow.com/questions/17716565/

0 votes

Cet algorithme est seulement pour les matrices excessivement grandes.

7voto

Chris A. Points 3884

Il faut faire attention à ne pas faire de comparaisons justes avec le C++. Pouvez-vous afficher le code C++ qui montre les boucles internes principales que vous utilisez pour la multiplication de la matrice ? Je suis surtout préoccupé par la disposition de la mémoire et par le fait que vous faites des choses inutiles.

J'ai écrit une multiplication matricielle en C++ qui est aussi rapide que celle de Matlab, mais cela a demandé un certain soin. (EDIT : Avant Matlab utilisait les GPU pour cela).

Vous pouvez être pratiquement sûr que Matlab ne gaspille que très peu de cycles avec ces fonctions "intégrées". Ma question est la suivante : où perdez-vous des cycles ? (Sans vouloir vous offenser)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X