【问题标题】:What's creating NaNs in OpenACC code?是什么在 OpenACC 代码中创建了 NaN?
【发布时间】:2016-07-04 04:18:44
【问题描述】:

我需要使用 OpenACC 检测 Fortran 代码。以下是相关部分:

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

当我检查“in dat”行和“in par”行的输出时,数字看起来很合理。当我检查“xin vals”行时,我看到了几个 NaN。不是所有的 NaN,而是几个。 xin的任务就是这么简单!可能出了什么问题? (如果你没有猜到,我是 OpenACC 的新手。谢谢。)

编辑:这是用 PGI Fortran 编译的。

【问题讨论】:

  • 使用标签 Fortran 以获得更好的可见性。问题中没有特定于 Fortran 90 的内容。
  • @Vladimir F 好的,谢谢您的提示!
  • 既然 xin 有 NaN,那么可能 'x' 有 nan。您可以检查 x 中的值以查看那里是否有 Nans

标签: loops fortran nan fortran90 openacc


【解决方案1】:

不知道你的编译器(你没有说是哪一个)在做什么,但在parallel 区域内实现print 肯定是不平凡的。如果将调试prints 移到并行区域之外(实际上是在data 区域之外),您会看到什么结果?然后,您需要使用copyout 子句代替create(xin(:,:)),以便在data 区域之后检查主机上的数据。

【讨论】:

  • @techwinge 我想我可以证明这一点,但是我在数据区域之外的打印语句显示了良好的数据,没有 NaN。检查数据区域之后的数据(同样,我没有在这里显示)显示 NaN 被复制回主机,与它们在数据区域中的显示方式一致。试图弄清楚这些 NaN 来自哪里实际上是我开始做这件事的原因。顺便说一句,我正在使用 PGI 进行编译。
猜你喜欢
  • 2020-05-11
  • 2020-04-07
  • 2022-06-12
  • 2017-06-09
  • 2020-03-22
  • 1970-01-01
  • 2013-12-17
  • 2010-12-30
  • 2012-02-16
相关资源
最近更新 更多