Tworzę podstawowy sprawdzian liczby liczb pierwszych oparty na C - determine if a number is prime, ale z wykorzystaniem OpenMP.Błąd kompilatora "nieprawidłowy controlling" przy użyciu OpenMP
int isPrime(int value)
{
omp_set_num_threads(4);
#pragma omp parallel for
for(int j = 2; j * j <= value; j++)
{
if (value % j == 0) return 0;
}
return value;
}
Podczas kompilacji z -fopenmp, GCC wersja 4.7.2 jest erroring, stwierdzając invalid controlling predicate
względem pętli for.
Wygląda na to, że ten błąd jest spowodowany przez j do kwadratu w pętli for. Czy istnieje sposób można obejść to i nadal osiągnąć pożądaną wydajność z algorytmu?
czy jesteś pewien, że instrukcja return jest dozwolona w konstrukcie pętli open mp? – alexbuisson
Niestety, równoległość pętli z OpenMP nie pomoże w testowaniu pojedynczego prime z podziałem próbnym. Można go jednak skutecznie wykorzystać do testowania wielu liczb pierwszych przy użyciu podziału próbnego. Jednakże, aby znaleźć listę liczb pierwszych, polecam Sito Eratostenesa. Oto wersja korzystająca z OpenMP http://create.stephan-brumme.com/eratosthenes/ –
Również w twojej funkcji 'isPrime' zalecam używanie' j <= j/value' zamiast 'j * j <= value' który może przepełnić http://rosettacode.org/wiki/Primality_by_trial_division#C –