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
LAPACK et la vectorisation. mathworks.com/company/newsletters/news_notes/clevescorner/
0 votes
Algorithme classique de multiplication de matrice à travers 3 boucles for, les résultats de matlab semblent bons, pas exacts (mais très proches) en utilisant des flottants mais je pense que c'est à cause de l'arrondi des nombres dans les langues.
0 votes
tic
ettoc
pour un timing approximatif.0 votes
Et n'oubliez pas que Matlab fait probablement des calculs en double précision alors que le GPU (à moins qu'il ne soit vraiment nouveau) fait des calculs en simple précision.
0 votes
Il faut faire attention à ne pas faire de comparaisons justes avec le C++. Pouvez-vous poster 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 que Matlab n'utilise les GPU pour cela). Vous pouvez être pratiquement sûr que Matlab ne gaspille que très peu de cycles sur ces fonctions "intégrées". Ma question est la suivante : où perdez-vous des cycles ? (Sans vouloir vous offenser)
0 votes
Avez-vous vérifié que toutes les implémentations utilisent des optimisations multi-threading pour l'algorithme ? Et utilisaient-elles le même algorithme de multiplication ? J'en doute vraiment. Matlab n'est pas intrinsèquement rapide, vous avez probablement utilisé des implémentations lentes. Algorithmes pour une multiplication efficace des matrices
0 votes
Qu'en est-il de l'utilisation de plusieurs cœurs ? Votre boucle séquentielle imbriquée ne le fera pas.
11 votes
En fait, je pense que cet article est vraiment intéressant, mais j'aimerais vraiment voir des repères plus appropriés. Par exemple, je pense que Matlab R2011a utilise automatiquement le multithreading et que les multiplications de matrices sont implémentées à l'aide de la bibliothèque mkl/blas d'Intel. Ainsi, je suppose que le c++ est plus rapide si l'on utilise un appel mkl pour effectuer la multiplication matricielle. La question serait alors de savoir quel est l'overhead de Matlab. Je sais que cela dépend des détails supplémentaires de la multiplication de la matrice, mais les chiffres ci-dessus sont plutôt insignifiants pour le moment.
0 votes
Faire "temp += matice1[j][m] * matice2[m][k] ;" dans votre code c++ vous donnera un peu d'avance ; d'autant plus que la taille de la matrice augmente.
0 votes
Vous pourriez échanger la boucle K et la boucle M. Cela améliorera votre code C++ car il utilise mieux les caches. Voir martin-thoma.com/matrix-multiplication-python-java-cpp
0 votes
Question similaire : Multiplication matricielle C++ naïve 100 fois plus lente que BLAS ?
0 votes
Quels chipsets CPU/GPU, compilateurs et versions ont été utilisés pour obtenir ces mesures ?
0 votes
Ce code n'est pas non plus adapté au cache...
1 votes
Vous pouvez utiliser "l'algorithme de Strassen" d'un temps d'exécution O(n^2.81) pour la multiplication de grandes matrices carrées qui est environ 10x plus rapide que la multiplication native qui s'exécute en O(n^3). également SSE/AVX peut vous aider à obtenir environ 8-20x plus rapide pour l'exécution du code. tous ensemble vous pouvez avoir une implémentation c plus rapide que celle de matlab.
0 votes
Je n'ai jamais compris comment, dans les années 90, je pouvais
inv(rand(1000))
et il renvoie un résultat en secondes. C'était sur un Intel 286 DX de 50 Mhz avec un coprocesseur mathématique.0 votes
Utiliser la bibliothèque MKL pour c++ puis comparer les résultats,
0 votes
J'arrive tard dans la soirée, mais on peut dire sans risque de se tromper que l'implémentation CUDA a probablement besoin de beaucoup de mémoire partagée TLC si elle ne fait qu'atteindre le débit de Matlab. En supposant que le GPU utilisé n'est pas très vieux.