Wie Sperre in OpenMP benutzen?
-
25-09-2019 - |
Frage
Ich habe zwei Stücke von C ++ Code auf 2 verschiedenen Kernen ausgeführt wird. Beide schreiben in die gleiche Datei.
Wie OpenMP verwenden und stellen Sie sicher, es gibt keinen Absturz?
Lösung
Sie möchten die OMP_SET_LOCK
/ OMP_UNSET_LOCK
Funktionen: https://computing.llnl.gov/tutorials / OpenMP / # OMP_SET_LOCK . Grundsätzlich gilt:
omp_lock_t writelock;
omp_init_lock(&writelock);
#pragma omp parallel for
for ( i = 0; i < x; i++ )
{
// some stuff
omp_set_lock(&writelock);
// one thread at a time stuff
omp_unset_lock(&writelock);
// some stuff
}
omp_destroy_lock(&writelock);
Die meisten Sicherungsroutinen wie pThreads Semaphore und sysv Semaphore Arbeit auf diese Art von Logik, obwohl die spezifischen API-Aufrufe unterschiedlich sind.
Andere Tipps
Zum Wohle derer kommen nach, critical
verwendet, ist eine weitere Option. Sie können sogar kritische Abschnitte genannt werden.
Zum Beispiel:
#include <omp.h>
void myParallelFunction()
{
#pragma omp parallel for
for(int i=0;i<1000;++i)
{
// some expensive work
#pragma omp critical LogUpdate
{
// critical section where you update file
}
// other work
#pragma omp critical LogUpdate
{
// critical section where you update file
}
}
}
Edit: Es gibt ein großen Thread in den Kommentaren von Victor Eijkhout eingeleitet. Zusammenfassend und paraphrasieren: Kurz critical
sperrt ein Code-Segment. Das kann in komplexeren Beispielen sein Overkill, wo alles, was Sie wollen, ist zu tun, um ein bestimmtes Datenelement sperren. Es ist wichtig, dies zu verstehen, bevor Sie eine Wahl zwischen den beiden Methoden.
#pragma omp critical
{
// write to file here
}