Ich arbeite mit OpenMP, um einen Algorithmus mit einer nahezu linearen Beschleunigung zu erhalten. Leider ist mir aufgefallen, dass ich die gewünschte Beschleunigung nicht erreichen konnte.Keine Beschleunigung mit OpenMP
Also, um den Fehler in meinem Code zu verstehen, schrieb ich einen anderen Code, einen einfachen, nur um zu überprüfen, dass die Beschleunigung im Prinzip auf meiner Hardware erhältlich war.
Dies ist das Spielzeug Beispiel schrieb ich:
#include <omp.h>
#include <cmath>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <cstdlib>
#include <fstream>
#include <sstream>
#include <iomanip>
#include <iostream>
#include <stdexcept>
#include <algorithm>
#include "mkl.h"
int main() {
int number_of_threads = 1;
int n = 600;
int m = 50;
int N = n/number_of_threads;
int time_limit = 600;
double total_clock = omp_get_wtime();
int time_flag = 0;
#pragma omp parallel num_threads(number_of_threads)
{
int thread_id = omp_get_thread_num();
int iteration_number_local = 0;
double *C = new double[n]; std::fill(C, C+n, 3.0);
double *D = new double[n]; std::fill(D, D+n, 3.0);
double *CD = new double[n]; std::fill(CD, CD+n, 0.0);
while (time_flag == 0){
for (int i = 0; i < N; i++)
for(int z = 0; z < m; z++)
for(int x = 0; x < n; x++)
for(int c = 0; c < n; c++){
CD[c] = C[z]*D[x];
C[z] = CD[c] + D[x];
}
iteration_number_local++;
if ((omp_get_wtime() - total_clock) >= time_limit)
time_flag = 1;
}
#pragma omp critical
std::cout<<"I am "<<thread_id<<" and I got" <<iteration_number_local<<"iterations."<<std::endl;
}
}
ich noch einmal hervorheben, dass dieser Code nur ein Spielzeug-Beispiel wollen zu versuchen, die Speedup zu sehen: der erste für Zyklus kürzer wird, wenn die Anzahl von parallelen Threads erhöht (seit N abnimmt).
Wenn ich jedoch von 1 bis 2-4 Threads gehe, verdoppelt sich die Anzahl der Iterationen wie erwartet; Dies ist jedoch nicht der Fall, wenn ich 8-10-20 Threads verwende: Die Anzahl der Iterationen steigt nicht linear mit der Anzahl der Threads.
Könnten Sie mir bitte dabei helfen? Ist der Code korrekt? Sollte ich eine nahezu lineare Beschleunigung erwarten?
Ergebnisse
Ausführen des Codes oben habe ich die folgenden Ergebnisse erhielt.
1 Thread: 23 Iterationen.
20 Threads: 397-401 Iterationen pro Thread (statt 420-460).
Mit welcher Hardware arbeiten Sie? Bitte geben Sie spezifische Angaben zu Prozessor (en) und Speicher an. Welche Compiler-Version und welche Optionen und welches Betriebssystem? Wie viele Iterationen beobachten Sie? – Zulan
Problematische Aspekte in Ihrer Messung: 'CD' wird nie benutzt, so dass der Compiler alles, was Sie teuer erwarten, einfach optimieren kann. Sie sollten mindestens "iteration_number_local" ausgeben (verwenden Sie 'pragma omp kritisch '). – Zulan
Ich führe den Code auf einer Hardware mit zwei 10-Core Intel Xeon-E5 (so habe ich 20 Kerne insgesamt) mit 256 GB RAM. Das Betriebssystem ist Linux. Ich weiß nicht über den Compiler: Ich lade ein Modul namens "gsl 1.15", während die cmake einen Compiler namens "ICC" aufrufen. Ich denke, das ist nicht das, was Sie gefragt haben, bitte klären Sie mich besser. Ich mache einige schnelle Simulationen mit n = 1000, m = 200. Mit 1 Thread bekomme ich 3 Iterationen in 120 Sekunden. Mit 2 Threads bekomme ich 5 Iterationen pro Thread (statt 6). Bei 20 Threads bekomme ich zwischen 40 und 44 Iterationen pro Thread (statt 60!). – Mobius88