2013-07-25 11 views
41

Czy istnieje jakieś przeciwwskazanie, aby to zrobić? Czy też zachowanie jest dobrze określone?Używanie OpenMP z C++ 11 w oparciu o pętle?

#pragma omp parallel for 
for(auto x : stl_container) 
{ 
    ... 
} 

Ponieważ wydaje się, że specyfikacja OpenMP jest ważna tylko dla C++ 98, ale myślę, że może być więcej niezgodności wynikające z C++ 11 wątków, które nie są tu stosowane. Chciałem być jeszcze pewien.

+0

+ Dobre pytanie. Też chcesz to wiedzieć. – lulyon

Odpowiedz

28

Specyfikacja OpenMP 4.0 została sfinalizowana i opublikowana kilka dni temu here. Nadal ustala, że ​​pętle równoległego może mieć postać kanoniczną (§2.6, str.51)

for (startowe wyrażenie;testowy wyrażenie;przyrostowo lista_wyrażeń_sortowania)strukturze blok

Standard pozwala na pojemnikach zapewniających iteratory o dostępie swobodnym być stosowany we wszystkich wyrażeń, np

#pragma omp parallel for 
for (it = v.begin(); it < v.end(); it++) 
{ 
    ... 
} 

Jeśli nadal nalegać na użyciu cukru składniowej C++ 11, a jeśli trzeba, (względnie) dużo czasu, aby przetworzyć każdy element stl_container, wówczas można użyć pojedynczy producent wielozadaniowych wzoru:

#pragma omp parallel 
{ 
    #pragma omp single 
    { 
     for (auto x : stl_container) 
     { 
     #pragma omp task 
     { 
      // Do something with x, e.g. 
      compute(x); 
     } 
     } 
    } 
} 

Zadanie powoduje pewien narzut, więc nie byłoby sensu używać tego wzorca, jeśli compute(x); zajmuje bardzo mało czasu.

+0

Myślę, że iteratory są już w drodze, ale jeśli chcesz, aby Twój kod skompilował się z gcc, musisz zastąpić! = Z DarioP

+0

Według tej strony: http://www.cplusplus.com/reference/iterator/RandomAccessIterator/ powinien działać ... –

+0

W tej witrynie nie umieszczają żadnej pragmy przed cyklem. Po prostu spróbuj go skompilować :) – DarioP

Powiązane problemy