opération sur les éléments de tableaux
Bonjour,
Jusqu'à présent j'ai codé en Matlab mes modèles de simulations de fluide. Jusqu'à présent tout le monde me disait que je devrais utiliser c++ (ou fortran) c'est plus rapide.
Aujourd'hui je me suis dit qu'on allait essayer... Je n'arrive pas à la même conclusion, j'aimerai donc un peu de vos lumières (je suis débutant en c++).
En Matlab il faut à mon PC 0.176 secondes pour faire la somme élément à élément de deux matrices contenant 5000x5000 nombres aléatoires (double précision).
En C++ il lui faut 1.46 (presque 10 fois plus lent)!
Alors comme je débute en C++, je ne fais peut être pas les choses correctement. Je ne suis pas arrivé à trouver de bibliothèque qui me permette de faire des opérations à la volé entre 2 tableaux en c++ comme on peut le faire en Matlab. J'ai donc 2 boucles imbriquées... Bref, je vous met le code ci-dessous (les fonctions tic toc sont codés ailleurs, j'ai utilisé ça: http://www.cplusplus.com/reference/ctime/).
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| #include "tic_toc.h"
#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
int main()
{
int n(5000);
double* A = new double[n*n];
double* B = new double[n*n];
double* C = new double[n*n];
int i(0);
int j(0);
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
A[i*j] = float(rand() % 100000)/100000;
B[i*j] = float(rand() % 100000)/100000;
}
}
tic();
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
C[i*j] = A[i*j] + B[i*j];
}
}
toc();
delete[] A;
delete[] B;
delete[] C;
system("pause");
return 0;
} |
J'ai quand même remarqué qu'en utilisant ça
Code:
1 2 3 4
| for (i = 0; i < n*n; i++)
{
C[i] = A[i] + B[i];
} |
le temps de l'opération tombait 0.23 secondes.
Pouvez vous me m'expliquer si bon benchmark est comparable, s'il y a d'autres moyens de faire en c++ (une librairie?) etc.
NB: Je ne parallélise pas car mon Matlab s’exécute sur un cœur. A terme je compte bien passer en c++ pour pouvoir paralléliser mes modèles.
Merci d'avance pour votre aide/explications.