2012-09-07 10 views
8

Czy można używać pragmatów omp takich jak krytyczne, pojedyncze, wzorce lub bariery poza blokiem równoległym omp? Mam funkcję, która może być wywołana z bloku równoległego OMP, lub nie. Jeśli tak, muszę zamknąć część kodu w sekcji krytycznej. Innymi słowy, czy ten kod jest w porządku?omp pragmas outside omp równoległy blok

void myfunc(){ 
    #pragma omp critical 
    { /* code */ } 
} 

// not inside an omp parallel region 
myfunc(); 

#pragma omp parallel 
{ 
    // inside an omp parallel region 
    myfunc(); 
} 

Nie znalazłem żadnej wzmianki o tym w dokumentacji OpenMP. Domyślam się, że kod powinien zachowywać się dokładnie tak, jak przy wykonywaniu 1 wątku - i tak to działa z gcc. Chciałbym wiedzieć, czy to zachowanie jest przenośne, czy jest to coś, czego specyfikacja nie definiuje i czego można się spodziewać.

+0

Myślę, że jest to w porządku dla większości pragm. – osgx

Odpowiedz

2

Według this dokumentu:

The Do/o, przekroje, SINGLE, dyrektywy MASTER i bariera wiąże się z równoległego dynamicznie załączając, jeśli taki istnieje. Jeśli obecnie nie jest wykonywany żaden region równoległy, dyrektywy nie mają zastosowania.

Więc odpowiedź brzmi, że pragmy mogą być używane poza równoległym regionem. Chociaż nadal nie znalazłem tego wyraźnie w dokumentacji.

Powiązane problemy