2016-03-17 1 views
0

J'ai besoin d'un code Fortran avec OpenACC. Voici les parties pertinentes:Qu'est-ce qui crée des NaN dans le code OpenACC?

program myprogram 


real :: x(160,100,100,8) 
!$acc declare create(x(:,:,:,:)) 
integer, parameter :: ns1=1 
integer, parameter :: ns2=8 
integer, parameter :: nx=160 
!$acc declare create(ns1,ns2,nx) ! apparently I don't need this line? 

! lots of stuff happens to define x and plenty of 
! other things, then … 

subroutine myroutine(id1,id2) 

real xin(160,8) 

!$acc update device(x(:,:,:,:)) 

!$acc data copyin(id1,id2,taskid) create(xin(:,:)) 

!debug 
     print *, 'in dat',taskid,x(80,id1,id2,1),x(81,id1,id2,1),x(82,id1,id2,1) 
! define new arrays for velocity and density 

!$acc parallel num_gangs(8) vector_length(160) 
!debug 
     print *, 'in par',taskid,x(80,id1,id2,1),x(81,id1,id2,1),x(82,id1,id2,1) 

!$acc loop gang 
     do ni = ns1,ns2 
!$acc loop vector 
     do i = 1,nx 
      xin(i,ni) = x(i,id1,id2,ni) 
     enddo 
     enddo 
!debug 
     print *, 'xin vals',taskid,xin(80,1),xin(81,1),xin(82,1) 

!$acc end parallel 

!$acc end data 

end subroutine 


end program 

Lorsque j'examine la sortie du « dans dat » lignes, puis des lignes « à la hauteur », les chiffres semblent raisonnables. Quand j'examine les lignes "xin vals", je vois plusieurs NaNs. Pas tous les NaN, mais plusieurs. L'affectation de xin est si simple! Qu'est-ce qui aurait pu mal tourner? (Et au cas où vous ne l'auriez pas deviné, je suis assez nouveau à OpenACC Merci.)

EDIT: Ceci a été compilé avec PGI Fortran.

+0

Utilisez l'étiquette Fortran pour une meilleure visibilité. Il n'y a rien de spécifique à Fortran 90 dans la question. –

+0

@Vladimir F OK, merci pour le pourboire! –

+0

puisque xin a NaNs, alors probablement 'x' a des nans. Vous pouvez vérifier les valeurs dans x pour voir s'il y a des Nans là – jitihsk

Répondre

0

Je ne sais pas ce que votre compilateur (vous ne dites pas lequel) fait, mais certainement mettre en œuvre print dans une région parallel est non-trivial. Quels résultats voyez-vous si vous déplacez le débogage print s en dehors de la région parallèle (en dehors de la région data, en fait)? Au lieu de create(xin(:,:)) vous devrez alors utiliser une clause copyout, afin que vous puissiez inspecter les données sur l'hôte, après la région data.

+0

@techwinge Je suppose que j'aurais pu le montrer, mais mes instructions d'impression en dehors de la région de données montrent de bonnes données, pas de NaN. L'examen des données après la région de données (encore une fois, je n'ai pas montré ici) montre que les NaN sont copiés à l'hôte, en cohérence avec la façon dont ils apparaissent dans la région de données. Essayer de comprendre d'où provenaient ces NaN était en fait ce qui m'a permis de commencer. Et en passant, je compile avec PGI. –