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.
Utilisez l'étiquette Fortran pour une meilleure visibilité. Il n'y a rien de spécifique à Fortran 90 dans la question. –
@Vladimir F OK, merci pour le pourboire! –
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