Pourquoi les variables de boucle doivent-elles être signées en parallèle pour?

J’apprends tout simplement OpenMP à partir de didacticiels et de ressources en ligne. Je veux quadriller une masortingce (la multiplier par elle-même) en utilisant une boucle parallel for . Dans la documentation du compilateur IBM , j’ai trouvé l’exigence selon laquelle “la variable d’itération doit être un entier signed “. Est-ce également vrai dans la mise en œuvre de GCC? Est-ce spécifié dans le standard OpenMP? Si oui, y a-t-il une raison pour cette exigence?

(Cela n’a pas beaucoup d’importance, car les dimensions attendues sont beaucoup plus petites que INT_MAX , mais cela me coûte quelques lancers.)

Selon la spécification OpenMP 3.0: http://www.openmp.org/mp-documents/spec30.pdf , la variable peut être de type entier signé ou non signé, voir 2.5.1 Construction de boucle. La question est de savoir si l’implémentation OpenMP donnée correspond à cette dernière spécification.

Citation from Pourquoi les variables d’index OpenMP non signées ne sont-elles pas autorisées? :

Selon la spécification OpenMP 2.0 C / C ++ API (pdf), section 2.4.1, il s’agit de l’une des ressortingctions de la boucle for. Aucune raison n’est donnée pour cela, mais je suppose que c’est simplement pour simplifier les hypothèses que le code et le compilateur doivent faire, car il existe un code spécial pour s’assurer que la plage ne dépasse pas la valeur maximale du type.

OpenMP 3.0 autorise apparemment aussi les types non signés, mais je ne l’ai pas encore vu en action.

En bref, cela fait partie de la norme et la prochaine version autorisera les entiers non signés.

Voici une raison possible derrière cela. Le même article dit que

  • b, ub, incr sont des expressions entières signées invariantes à la boucle et
  • exit_cond prend la forme suivante: iv <= ub ou iv < ub ou iv >= ub ou iv > ub (où iv est la variable d'itération pour laquelle vous posez des questions)

étant donné que la condition exit_cond implique une comparaison et que la comparaison est effectuée avec une variable ub signée, la variable de boucle iv doit être signée pour éviter les problèmes éventuels de comparaison signée / non signée.

Pour répondre à votre première question sur gcc . Non, il semble que gcc accepte facilement les variables de boucle unsigned ou size_t dans quelque chose comme

 #pragma omp parallel for for (size_t i = 0; i < N; ++i) { /* do it */ } 

au moins le mien (gcc v 4.4 sur un ubuntu 64bit) ne se plaint pas et fait ce qui est juste.