2017-06-04 2 views
1

Ich versuche, ein dynamisches Array mit OpenMP in C zu initialisieren, aber es scheint langsamer zu sein als die serielle Methode. Die Funktion ich verwende istOpenMP - Initialisierung 1D Array

int* createArray(int size, int num) { 
    int i; 
    int* M = (int*)malloc(size*sizeof(int)); 

    srand(time(NULL)); 
    double start = omp_get_wtime(); 

    #pragma omp parallel for num_threads(num) 
    for (i = 0; i < size; i++) { 
     M[i] = rand() % (MAX_NUMBER - MIN_NUMBER + 1) + MIN_NUMBER; 
    } 

    double end = omp_get_wtime(); 
    printf("Create Array %f\n",end-start); 
    return M; 
} 

ich ein Array von der angegebenen Größe enthält, Zufallszahlen, aber die weniger Threads ich je schneller die Funktion ist. Mache ich etwas falsch?

+1

Es gibt viele Qs und As hier auf SO erklärt, warum nicht 'rand' in OpenMP-Programmen zu verwenden. Zum Beispiel: https: //stackoverflow.com/questions/10624755/openmp-program-is-slower-than-sequential-one/10625090#10625090 –

+2

Mögliches Duplikat von [OpenMP-Programm ist langsamer als sequenzielles] (https: // stackoverflow.com/questions/10624755/openmp-program-is-slower-than-sequential-one) – Zulan

Antwort

1

Im Allgemeinen kommt eine parallele Anwendung, die langsamer als die entsprechende sequenzielle Implementierung abläuft, entweder aus dem Overhead des Startens der Threads oder aus dem Engpass von nicht perfekt unabhängigen Threads (, z. B. über gemeinsam genutzte Daten).

Hier ist ersteres wahr, weil Sie rand() aufrufen. Diese Funktion verwendet irgendwie globale Variablen, die zwischen Threads geteilt werden müssen. Eine Möglichkeit, dies zu umgehen, wäre die Verwendung eines private Seeds für jeden Thread. Haben Sie bemerkt, dass Ihr Array nicht wirklich zufällig ist, wenn Sie mehrere Threads haben? Sie könnten den gelieferten Samen srand() eine Funktion von omp_get_thread_num() zur Verfügung stellen, um dies zu lösen.

0

Ich bin ziemlich sicher, dass Ihr Programm ein Problem namens "false Sharing" -Cache leidet.

Der folgende Artikel erklärt es recht gut. https://software.intel.com/en-us/articles/avoiding-and-identifying-false-sharing-among-threads

Dies wirkt sich oft sehr stark auf die Leistung aus. können Sie schnell einen Test haben. fügen Sie unten zu Ihrem omp Pragma Zeitplan (statisch, 16)

sollte dies eine Menge verbessern. dann kannst du weiter über falsches Teilen nachdenken.