“non valide le contrôle de prédicat” erreur de compilation en utilisant OpenMP
Je suis en création d'un nombre premier outil, basé sur C - déterminer si un nombre est premier , mais utilisant 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;
}
Lors de la compilation avec -fopenmp, la version de GCC 4.7.2 est erroring, indiquant invalid controlling predicate
à l'égard de la boucle for.
Il ressemble à cette erreur est causée par le j au carré dans la boucle for. Est il possible que je peux contourner ce problème et d'obtenir le résultat souhaité de l'algorithme?
êtes-vous sûr que l'instruction return est autorisé dans un mp boucle de construire ?
Malheureusement, la parallélisation de la boucle avec OpenMP ne va pas les aider pour les essais pour un seul premier avec la division de première instance. Vous pouvez, cependant, utiliser efficacement pour les tests multiples des nombres premiers en utilisant la section de première instance. Cependant, pour trouver des listes de nombres premiers, je recommande le Crible d'Eratosthène. Voici une version utilisant OpenMP create.stephan-brumme.com/eratosthenes
Aussi, dans votre
Malheureusement, la parallélisation de la boucle avec OpenMP ne va pas les aider pour les essais pour un seul premier avec la division de première instance. Vous pouvez, cependant, utiliser efficacement pour les tests multiples des nombres premiers en utilisant la section de première instance. Cependant, pour trouver des listes de nombres premiers, je recommande le Crible d'Eratosthène. Voici une version utilisant OpenMP create.stephan-brumme.com/eratosthenes
Aussi, dans votre
isPrime
fonction je vous recommande d'utiliser j <= j/value
au lieu de j*j <= value
qui peuvent déborder, rosettacode.org/wiki/Primality_by_trial_division#COriginalL'auteur Nick | 2013-07-10
Vous devez vous connecter pour publier un commentaire.
return
n'est pas admis à l'intérieur de la boucle, comme il sera la cause de la sortie avant les accolades.Noter la définition qui en est donnée ci-dessous :
De la OpenMP V2.5 spec, 1.2.2 OpenMP langue de la terminologie, p2:17-
Structuré bloc commence par l'ouvrir
{
et se termine avec la fermeture}
. Lereturn
est contenue à l'intérieur de ces accolades, alors ce programme porte également atteinte à la OpenMP définition structuré bloc, parce qu'il a deux sorties (dont une à l'return
et un à la sortie à travers le corset)OpenMP endroits les cinq restrictions sur les boucles qui peut être fileté:
comme DWORD, ne fonctionnera pas.
<
,<=
,>
,ou
>=
loop_invariant_integersoit entier plus ou entier de la soustraction et par une boucle
l'invariant de valeur.
<
ou<=
, la variable de boucle doitincrémenter à chaque itération, et à l'inverse, si la comparaison
l'opération est
>
ou>=
, la variable de boucle doit décrémenter à chaqueitération.
la boucle vers l'extérieur sont autorisés, à l'exception de la sortie
la déclaration, qui met fin à l'ensemble de l'application. Si les déclarations
goto ou de rupture sont utilisés, ils doivent sauter à l'intérieur de la boucle, pas à l'extérieur
c'. Il en va de même pour la gestion des exceptions; les exceptions doivent être pris
à l'intérieur de la boucle.
OriginalL'auteur 0decimal0
Selon le standard OpenMP (§2.5.1, p.40), les formes acceptables de contrôle de prédicat de la
for
boucle sont:Votre utilisation de
j * j <= value
est clairement une violation de cette exigence. La raison en est qu'il exige le compilateur pour émettre le code qui calcule l'entier de la racine carrée devalue
au moment de l'exécution, cette dernière étant pas défini pour certaines valeurs devalue
, en particulier pour la négative.Vous pouvez remplacer
j * j <= value
avecj <= sqrt_value
, oùsqrt_value
est le nombre entier de la racine carrée devalue
, mais ensuite viendrait le problème avec le fait d'avoir une alternative de chemin de sortie dans la structure du bloc à l'intérieur de la boucle. Malheureusement pas de solution simple existe dans ce cas depuis OpenMP ne prend pas en charge de l'arrêt prématuré de boucles parallèles.OriginalL'auteur Hristo Iliev