2013-07-25 11 views
41

Bunu yapmak için herhangi bir karşı işaret var mı? Yoksa iyi belirlenmiş davranış mı?OpenMP'yi C++ 11 serisi döngüler için mi kullanıyorsunuz?

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

o OpenMP şartname C++ 98 için geçerlidir görünüyor ama burada kullanılmaz C++ 11 konuda nedeniyle daha uyumsuzluklar, olabilir sanırım çünkü. Hala emin olmak istedim.

+0

+ İyi bir soru. Bunu da bilmek isterdim. – lulyon

cevap

28

OpenMP 4.0 belirtimi sonlandırılmış ve birkaç gün önce yayınlanmıştır here.

for (init-İfade;test İfade;artırım-İfade)yapılandırılmış blok: hala paralel halka (§2.6, s.51) kanonik şeklinde olmalıdır mandates

0:

standart rasgele erişimli yinelemeler ifadeleri her kullanılmak üzere temin kaplar, örneğin, izin verir Hala C++ 11 sözdizimsel şeker kullanmakta ısrar ve stl_container her bir öğesini işlemek için bir zaman (nispeten) çok zaman alır, o zaman deseni görev tek yapımcı kullanabilirsiniz Eğer

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

:

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

Görevlendirme, belirli bir yükü tetikler; bu nedenle, compute(x);'un tamamlanması çok az zaman alırsa bu deseni kullanmanın bir anlamı yoktur.

+0

Yinelemelerin şu anda gitmenin yolu olduğunu düşünüyorum, ancak kodunuzun gcc ile derlenmesini istiyorsanız, yerine =! = bir "geçersiz denetleyici yüklemi" hatası almanız gerekir. Bu arada, nedenini biliyor musun? – DarioP

+0

Bu web sitesine göre: http://www.cplusplus.com/reference/iterator/RandomAccessIterator/ işe yaramalı ... –

+0

Bu web sitesinde çevrimden önce pragma koymazlar. Sadece derlemeyi deneyin :) – DarioP