Parallélisation (BenchMark C++/OpenMP vs PB )

Vous avez une idée pour améliorer ou modifier PureBasic ? N'hésitez pas à la proposer.
G-Rom
Messages : 3626
Inscription : dim. 10/janv./2010 5:29

Parallélisation (BenchMark C++/OpenMP vs PB )

Message par G-Rom »

Pourrais ton avoir la possibilité comme le permet OpenMP de paralléliser ses boucles ?

par exemple :
UseParallelFor
For i = 0 to 10000000
....
next

ou le mot clé UseParallelFor serait une directive de compilation afin que la boucle soit découpé & répercuté sur chaque cœur disponible.

je me suis amusé a faire un test de comparaison avec PB & g++:

En PB :

Code : Tout sélectionner

OpenConsole()

#SIZE = 100000

clock = ElapsedMilliseconds()
For i = 0 To #SIZE-1
  For j = 0 To #SIZE-1
    index = i + #SIZE * j
  Next
Next
clock_stop = ElapsedMilliseconds() - clock

PrintN("Time : "+Str(clock_stop) + "ms")
PrintN("press enter to quit")
Input()
En C++ sans OpenMP & g++ 6.3.0 & l'option de compilation -O1:

Code : Tout sélectionner

#include <iostream>
#include <cstdio>
#include <ctime>

#define SIZE 100000

int main() {
	
	unsigned long int index;	
    std::clock_t start;
    double duration;

    start = std::clock();

    for(unsigned long int i=0; i<SIZE; ++i){
		for(unsigned long int j=0; j<SIZE; ++j){
			index = i + SIZE * j;
		}
	}

    duration = ( std::clock() - start ) / (double) CLOCKS_PER_SEC;

    std::cout<<"Time : "<< duration * 1000 << "ms " << std::endl;
}
En c++ avec OpenMP & g++ 6.3.0 & l'option de compilation -O1 :

Code : Tout sélectionner

#include <iostream>
#include <cstdio>
#include <ctime>

#define SIZE 100000

int main() {
	
	unsigned long int index;	
    std::clock_t start;
    double duration;

    start = std::clock();
	
	#pragma omp parallel for 
    for(unsigned long int i=0; i<SIZE; ++i){
		for(unsigned long int j=0; j<SIZE; ++j){
			index = i + SIZE * j;
		}
	}

    duration = ( std::clock() - start ) / (double) CLOCKS_PER_SEC;

    std::cout<<"Time : "<< duration * 1000 << "ms " << std::endl;
}
C'est le même code mais avec une macro devant la double boucle...

Les résultats sont édifiants :
  • PureBasic------------> 11132ms
    C++ -O1----------------> 2286ms
    C++ -O1 & OpenMP--> 576ms