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 afor
directive.
GCC'nin davranışı doğru mu? ya da yanlış bir şey mi? En yönelik sonunda diğeri:
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
GCC bir uyarı verir, Clang uyarı vermez ve ICC ilk durumda derlenemez. Üç derleyicinin hepsi ikinci durumda uyarı yapmadan derler. İlginç. –
@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. –