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?

War es hilfreich?

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
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top