2016-12-17 2 views
0

Hier ist mein Test-Code für OpenMPWarum eine einfache for-Schleife ohne OpenMP schneller, als es mit OpenMP ist

#include <stdio.h> 
#include <stdlib.h> 
#include <omp.h> 
#include <time.h> 


int main(int argc, char const *argv[]){ 

    double x[10000]; 
    clock_t start, end; 
    double cpu_time_used; 
    start = clock(); 

    #pragma omp parallel 
    #pragma omp for 
    for (int i = 0; i < 10000; ++i){ 
     x[i] = 1; 
    } 

    end = clock(); 
    cpu_time_used = ((double) (end - start))/CLOCKS_PER_SEC; 
    printf("%lf\n", cpu_time_used); 
    return 0; 
} 

ich den Code mit den folgenden zwei Befehle zusammengestellt:

gcc test.c -o main 

Der Ausgang main Rum ist 0.000039

Dann habe ich mit OpenMP zusammengestellt

und der Ausgang ist 0.008020

Könnte jemand mir helfen zu verstehen, warum es passiert. Danke im Voraus.

+0

Ich denke, Sie müssen Klammern nach der '#pragma omp parallel 'Anweisung um die' #pragma omp für' Schleife –

+0

meinst du so? '#pragma omp parallel {......}', habe ich versucht und es ist das gleiche und funktioniert nicht. –

+0

Es ist eine Weile her, seit ich openMP benutzt habe, aber der größte Kostenfaktor für den Code ist die Overhead-Verwaltung von Threads. Sie werden größere Erträge bei viel größeren Ausführungen sehen (versuchen Sie etwa 1 Million). –

Antwort

1

Wie High Performance Mark in seinem Kommentar so eloquent beschrieben, gibt es eine Kosten (Overhead) mit dem Erstellen von Threads und Verteilen von Arbeit. Für so ein winziges Stück Arbeit (39 US) überwiegt das Overhead alle möglichen Gewinne.

Das heißt, Ihre Messung ist auch irreführend. clock misst die CPU-Zeit und ist höchstwahrscheinlich nicht das, was Sie wollten (Wanduhr). Weitere Informationen finden Sie unter this question.

Ein weiteres Missverständnis, das Sie haben könnten: Sobald x groß genug ist, wird die einfache Schleife speichergebunden. Und Sie werden wahrscheinlich nicht die Beschleunigung sehen, die Sie erwarten. Auf einem typischen Desktop-System mit vier Kernen können Sie beispielsweise eine Beschleunigung von 1,5 x statt 4 x sehen.

+0

Ein großer Aufwand ist mit dem Erstellen von Threads verbunden, was normalerweise nur in der ersten parallelen Region geschieht. Ein realistischeres Maß für den Overhead (unter der Annahme, dass Ihr Code mehr als eine parallele Region hat) ist eine leere parallele Region, bevor Sie Ihr Timing starten, so dass die Threads erstellt wurden und Sie nur die normalen Kosten des Aufwachens messen sie auf. –