Sto creando un controllo numero primo di base, basato su C - determine if a number is prime, ma utilizzando OpenMP.Errore di compilazione "predicato di controllo non valido" con 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;
}
Quando si compila con -fopenmp, GCC versione 4.7.2 è erroring, affermando invalid controlling predicate
rispetto al ciclo for.
Sembra che questo errore sia causato dal j al quadrato nel ciclo for. C'è un modo per aggirare questo problema e ottenere comunque l'output desiderato dall'algoritmo?
sei sicuro che l'istruzione return sia consentita in un costrutto di ciclo aperto di mp? – alexbuisson
Sfortunatamente, parallelizzare il ciclo con OpenMP non aiuterà a testare un singolo primo con la divisione di prova. Tuttavia, è possibile utilizzarlo in modo efficace per testare più numeri primi utilizzando la divisione di prova. Tuttavia, per trovare liste di numeri primi, raccomando il Sieve di Eratostene. Ecco una versione che utilizza OpenMP http://create.stephan-brumme.com/eratosthenes/ –
Inoltre, nella funzione 'isPrime' ti consiglio di usare' j <= j/value' invece di 'j * j <= value' che può overflow http://rosettacode.org/wiki/Primality_by_trial_division#C –