2015-05-16 14 views
7

cancel yönergesini (OpenMP 4.0'dan beri) parallel for yapısında paralel döngüyü kırmak için kullandığımda, GCC 5.1, "#pragma omp" için 'now' nowait 'ifadesini yapı için uyarır " Aşağıdaki kod parçacığı için. Ben parallel + for yapılara bölünmüş GCC 5.1, 'for parallel for' yapısındaki yapılandırmayı iptal ediyor

const int N = 10000; 

int main() 
{ 
    #pragma omp parallel for 
    for (int i = 0; i < N; i++) { 
    #pragma omp cancel for // <-- here 
    } 
} 
çözüm için

http://coliru.stacked-crooked.com/a/de5c52da5a16c154

, GCC sessizce kodu kabul eder.

int main() 
{ 
    #pragma omp parallel 
    #pragma omp for 
    for (int i = 0; i < N; i++) { 
    #pragma omp cancel for 
    } 
} 

Ama GCC eski dava uyarıyor neden bilmiyorum, yine de yapı hayır 'nowait' hüküm bulunmaktadır. OpenMP 4.0 API spec da parallel for'un parallel + for yapılarına eşit olduğunu söylüyor.

2.10.1 Parallel Loop Construct

Description

The semantics are identical to explicitly specifying a parallel directive immediately followed by a for directive.

GCC'nin davranışı doğru mu? ya da yanlış bir şey mi? En yönelik sonunda diğeri:

+4

GCC'nin daha iyi bir hata mesajı vermesi gerektiğini düşünüyorum. Intel derleyicisi atar: "hata: iptal etme, bölge için yakından iç içe olmalı" (bu durum biraz daha mantıklı). Her ne kadar '' için '' paralel '' ve '' paralel '' benzerdir, '' iptal '' yapısı sadece bir yan tümcelere izin verir ... derleyicinin bir 'iptal' ile takip ettiği maddeyi okur ve kapalı yapıyı kontrol eder. ilk örneğinizde bu bir 'for' değil,' '' için paraleldir, dolayısıyla derleyici bu hatayı atar. Sadece 2 sentim. – Sayan

+0

GCC bir uyarı verir, Clang uyarı vermez ve ICC ilk durumda derlenemez. Üç derleyicinin hepsi ikinci durumda uyarı yapmadan derler. İlginç. –

+0

@Sayan, ICC'nin hata mesajının neden GCC'nin uyarısından daha iyi olduğundan emin değilim. Intel, iptalin açık bir döngü içinde olmadığını düşünür gibi görünüyor. Bu derleyici için doğru hata verir https://software.intel.com/en-us/articles/cdiag1159 gibi görünüyor. –

cevap

0

Benim tahminim kodunuzu

#pragma omp parallel for 
    for (int i = 0; i < N; i++) { 
    #pragma omp cancel for 
    } 

ikinci durumda

#pragma omp parallel 
    { 
    #pragma omp for 
    for (int i = 0; i < N; i++) { 
    #pragma omp cancel for 
    } 
    } //end of parallel region 

eşdeğer değildir yani iki engel var olacağını paralel bölgenin sonu;

#pragma omp parallel 
    { 
     #pragma omp for nowait 
     for (int i = 0; i < N; i++) { 
      #pragma omp cancel for 
     } 
     #pragma omp barrier 
    } // and here another implicit barrier 

ama optimizasyon amacıyla, compilter ikinci gereksiz engeli kaldırmak için deneyebilirsiniz ve oluşturduğu tahmin: bir şey eşdeğer daha fazla 'optimum' ama hiç dezavantajı var

#pragma omp parallel 
    { 
     #pragma omp for nowait 
     for (int i = 0; i < N; i++) { 
      #pragma omp cancel for 
     } 
    } 

Artık sahip olma konusunda uyar ve karışık iptal et.