Loop-Parallelisierung mit OpenMP



  • Hallo zusammen,

    ich versuche, eine for-Schleife mit OpenMP zu parallelisieren:

    #include<iostream>
    #include<ctime>
    #include<omp.h>
    using std::endl; using std::cout;
    
    double get_time(clock_t tstart, clock_t tend) {
    	double time = 0.0;
    	time = (double) (tend - tstart) / CLOCKS_PER_SEC;
    	time *= 1000;
    	return time;
    }
    
    
    int main() {
    	clock_t tstart, tend;
    	omp_set_num_threads(2);
    
    	double summe=0.0;
    	int n = 1000000;
    	tstart=clock();
    	for(int i=0;i<n;++i) {
    		summe += i*0.5;
    	}
    	tend=clock();
    	cout << "Keine Parallelisierung: " << summe << " ( " << get_time(tstart, tend) << " ms)" << endl;
    
    
    	summe=0.0;
    	tstart=clock();
    #pragma omp parallel
    {
    #pragma omp for
    	for(int i=0;i<n;++i) {
    		summe += i*0.5;
    	}
    }
    	tend=clock();
    	cout << "2 Threads: " << summe << " ( " << get_time(tstart, tend) << " ms)" << endl;
    }
    

    Als Ausgabe erhalte ich:

    Keine Parallelisierung: 2.5e+11 ( 2.834 ms)
    2 Threads: 6.24999e+10 ( 5.966 ms)
    

    In den meisten Faellen ist die parallelisierte Version langsamer, ausserdem variiert das Ergebnis immer und entspricht nie dem Ergebnis des nicht-parallelisierten Falls. Die Schleife, die ich nutze, muesste eigentlich gut geeignet sein, weil die einzelnen Schleifendurchlaeufe unabhaengig voneinander sind.

    Hat jemand eine Idee, was hier schief laeuft?

    Vielen Dank und liebe Gruesse!



  • @Urwald sagte in Loop-Parallelisierung mit OpenMP:

    #pragma omp for

    Das muss vermutlich #pragma omp for reduction(+:summe) lauten.

    Ich habe keine Ahnung von OpenMP, konnte das aber in ein paar Minuten herausfinden. Wie lernst du?



  • @manni66 sagte in Loop-Parallelisierung mit OpenMP:

    @Urwald sagte in Loop-Parallelisierung mit OpenMP:

    #pragma omp for

    Das muss vermutlich #pragma omp for reduction(+:summe) lauten.

    Ich habe keine Ahnung von OpenMP, konnte das aber in ein paar Minuten herausfinden. Wie lernst du?

    Hat geklappt, vielen Dank für deine Hilfe.



  • @Urwald sagte in Loop-Parallelisierung mit OpenMP:

    Hat jemand eine Idee, was hier schief laeuft?

    Der Aufwand in der Schleife ist einfach zu gering, das bringt so nichts. Dann solltest Du hier das passende Konstrukt nutzen. Es gibt die reduction clause, in in diesem Fall sinnvoller ist.


Anmelden zum Antworten