2017-10-20 2 views
0

appel à la fonction d'exécution PGI pas pris en charge - pgf90_copy_f77_argl_i8erreur de compilation des routines de OpenACC "pgf90_copy_f77_argl_i8"

Je crois me passer un argument entier 8byte à une routine $ selon.

Un travail autour ou mises à jour dans ce?

compilateur PGI 17,4

exemple.

type some 
integer(4),pointer :: xx(:) 
integer(4),pointer :: yy(:) 
end type 

type(some), pointer :: data(:) 
call func(data(3) % xx, data(5) % yy) 

Ici func est la routine acc, donc je suppose que ce type d'approche crée un problème.

Nous allons créer des tableaux temporaires, puis les transmettre.

Répondre

0

Cette routine vérifie si le tableau transmis est contigu ou non lors de l'utilisation de conventions d'appel F77. Si ce n'est pas contigu, le moteur d'exécution doit créer un tableau temporaire afin que la tranche de tableau soit transmise de manière contiguë.

Bien que vous disiez que vous passez dans un entier de 8 octets, passez-vous également dans une tranche de tableau?

Nous (PGI) avons un problème difficile ici. La "solution" serait pour nous de créer des routines d'exécution côté périphérique qui imitent le comportement que nous avons sur l'hôte. Cependant, cela signifierait que le compilateur devra ensuite allouer sur le périphérique un tableau temporaire pour chaque thread, copier les données découpées dans le tableau temporaire, passer dans le tableau temporaire, puis recopier les résultats dans le tableau principal. Cependant, cela détruirait absolument la performance de votre boucle, donc pas quelque chose que nous voulons vraiment faire.

C'est un sujet dont nous débattons en interne. Nous voulons que les utilisateurs soient en mesure de porter leur code plus facilement, mais sachez que si nous ajoutons ce support, cela nuira à la performance et ne sera pas évident à savoir pourquoi. Donc, pour l'instant, nous encourageons les utilisateurs à éviter de passer des tranches de tableau, au lieu de passer le tableau de base et d'ajouter des arguments supplémentaires pour les indices.

Certes, nous devons d'abord travailler sur les messages d'erreur afin qu'il soit plus clair quant au problème. J'ai poussé notre équipe de compilation, mais ce n'est pas simple. En attendant, si vous voyez un de ces appels "run", c'est ce qui se passe.

+0

Merci mat, J'ai ajouté un exemple de code dans la question. Peut-être que cela rend les choses plus claires. On dirait que la solution pour le moment serait de créer des tableaux temporaires et de les passer globalement avant d'appeler acc kerenels –

+0

Ok, donc le problème ici est que vous essayez de passer dans un pointeur. Puisque les pointeurs peuvent ne pas être contigus, c'est pourquoi vous devez ajouter ce contrôle d'exécution. Vous pouvez essayer d'ajouter l'attribut "contiguous" F2008 à la déclaration du pointeur afin que le compilateur sache qu'il n'a pas besoin de cette vérification. –