OpenMP for-Schleife im inneren Abschnitt
Ich würde gerne den folgenden code ausführen (unten). Ich möchte, um zu laichen zwei unabhängige threads, jeder würde führen Sie eine parallele for-Schleife. Leider bekomme ich eine Fehlermeldung. Offenbar parallel for
kann nicht hervorgebracht werden innerhalb section
. Wie löst man das?
#include <omp.h>
#include "stdio.h"
int main()
{
omp_set_num_threads(10);
#pragma omp parallel
#pragma omp sections
{
#pragma omp section
#pragma omp for
for(int i=0; i<5; i++) {
printf("x %d\n", i);
}
#pragma omp section
#pragma omp for
for(int i=0; i<5; i++) {
printf(". %d\n", i);
}
} //end parallel and end sections
}
Und der Fehler:
main.cpp: In function ‘int main()’:
main.cpp:14:9: warning: work-sharing region may not be closely nested inside of work-sharing, critical, ordered, master or explicit task region [enabled by default]
main.cpp:20:9: warning: work-sharing region may not be closely nested inside of work-sharing, critical, ordered, master or explicit task region [enabled by default]
InformationsquelleAutor Jakub M. | 2011-10-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
OpenMP kann nicht erstellen Sie parallele Bereiche innerhalb von parallelen Regionen. Dies ist aufgrund der Tatsache, dass die OpenMP-erstellen Sie am Anfang des Programms num_threads parallele threads, die in nicht parallelen Regionen, die anderen sind nicht benutzt und schlafen. Sie haben dies getan, wie die häufigen Generierung von neuen threads ist ziemlich langsam im Vergleich zu waking sleeping-threads.
Daher sollten Sie parallelisieren, nur die Schlaufen:
Ihr Recht in diesem Fall sollte es auf 5 gesetzt, aber es sollte kein problem sein, wenn es 10 ist, wie die anderen 5 einfach nur nichts tun.
Ich Stimme zu, es doens nicht, etwas zu brechen.
wikis.sun.com/display/openmp/Tasks+vs+Nested+Parallel+Regionen
InformationsquelleAutor tune2fs
Hier haben Sie verschachtelte Parallelität. Das problem mit der
omp for
imsections
ist, dass alle threads im Umfang haben, zu nehmen Teil in deromp for
, und Sie offensichtlich nicht — Sie sind gebrochen durch die Abschnitte. So haben Sie einzuführen, Funktionen und verschachtelte paralleism innerhalb der Funktionen.omp_set_num_thread()
), oder dass der verschachtelten Parallelität aktiviert ist (omp_set_nested()
) im code ist irgendwo zwischen nicht-best-practice und die Art von widerlich; Sie normalerweise wollen, dass die Benutzer in der Lage sein, diese mit Umgebungsvariablen. Sie befinden sich hier explizit nur für die tutorial Zwecke.InformationsquelleAutor Jonathan Dursi
Praktisch, optimale Anzahl von threads ist gleich der Anzahl der verfügbaren CPU-Kerne. Also, jedes parallel für umgegangen werden soll, die alle verfügbaren Kerne, was unmöglich ist, innerhalb von omp sections. Also, was Sie versuchen, zu erreichen, ist nicht optimal. tune2fs' Vorschlag zum ausführen von zwei Schleifen ohne Abschnitte macht Sinn und bietet die bestmögliche Leistung. Sie können ausführen paralleler Schleifen innerhalb anderer Funktionen, aber dieser "Betrug" nicht geben, die Leistung zu steigern.
Dursi - in diesem Fall dein Vorschlag ist OK. Ich dachte meist über lange Schleifen, wie in der Bildbearbeitung, die wichtigsten OpenMP Spezialisierung.
InformationsquelleAutor Alex F