Kiedy używam dyrektywy cancel
(od OpenMP 4.0) do przerwania pętli równoległej w obrębie konstruktu parallel for
, GCC 5.1 ostrzega" #pragma omp cancel dla 'wewnątrz' nowait 'dla konstrukcji " dla poniższego fragmentu.GCC 5.1 ostrzega o anulowaniu konstruktu w konstrukcji `parallel for`
const int N = 10000;
int main()
{
#pragma omp parallel for
for (int i = 0; i < N; i++) {
#pragma omp cancel for // <-- here
}
}
http://coliru.stacked-crooked.com/a/de5c52da5a16c154
Aby obejść ten problem, kiedy podzielone na parallel
+ for
konstruktów, GCC akceptuje kod cicho.
int main()
{
#pragma omp parallel
#pragma omp for
for (int i = 0; i < N; i++) {
#pragma omp cancel for
}
}
Ale nie wiem, dlaczego GCC ostrzega w poprzednim przypadku, ale konstrukcja nie ma klauzuli "nowait". OpenMP 4.0 API spec również mówi, że parallel for
jest równa konstrukcji parallel
+ for
.
2.10.1 Parallel Loop Construct
Description
The semantics are identical to explicitly specifying a
parallel
directive immediately followed by afor
directive.
Czy zachowanie GCC jest prawidłowe? czy coś nie tak?
Myślę, że GCC powinien emitować lepszy komunikat o błędzie. Kompilator Intel wyrzuca: "błąd: anuluj dla musi być ściśle zagnieżdżony w regionie" dla tego przypadku (co ma trochę więcej sensu). Chociaż 'parallel dla' i' parallel' po którym następuje 'for' są podobne, konstrukcja' cancel' pozwala tylko na jedną klauzulę ... metinks kompilator odczytuje klauzulę, po której następuje 'cancel' i sprawdza, co było obudową, w twoim pierwszym przykładzie jest to 'parallel for', a nie' for', stąd kompilator zgłasza ten błąd. Tylko moje 2 centy. – Sayan
GCC ostrzega, Clang nie ostrzega, a ICC nie kompiluje się w pierwszym przypadku. Wszystkie trzy kompilatory kompilują się bez ostrzeżenia w drugim przypadku. Ciekawy. –
@Sayan, nie jestem pewien, dlaczego komunikat o błędzie ICC jest lepszy niż ostrzeżenie GCC. Wydaje się, że Intel uważa, że anulowanie nie ma miejsca w pętli for, która jest wyraźnie widoczna. Wygląda na to, że ten przypadek jest https://software.intel.com/en-us/articles/cdiag1159, dla którego kompilator podaje poprawny błąd. –