0

我在 OpenACC 内核中遇到了数组问题。这是演示代码:

module mpoint
   type point
      real :: x, y, z
      real :: tmp
      real :: v(3)
   end type point
 end module mpoint
 
 program main
   
   use mpoint
   
   implicit none
 
   integer, parameter :: n = 3
   real, allocatable :: array(:)
   !--------------------------------
   
   allocate(array(n))
   array(:) = 1.0

   call vecadd
   
 contains
   subroutine vecadd()
     integer :: i
     type(point) :: A
     real :: w(3)
     real :: scalar

     A%v(:) = 0.0
     A%v(1) = 1.0

     w(:) = 0.0
     w(1) = 1.0
     
     scalar = 1.0

     write(*,*) 'host: v(1) = ', A%v(1)
     write(*,*) 'host: w(1) = ', w(1)
     write(*,*) 'host: scalar = ', scalar

     !$acc parallel loop firstprivate(A,w)
     do i = 1, n
        write(*,*) 'device: v(1) = ', A%v(1)
        write(*,*) 'device: w(1) = ', w(1)
        write(*,*) 'device: scalar = ', scalar
     enddo

   end subroutine vecadd
   
 end program main

当我编译nvfortran -acc -Minfo=accel test.f90并运行它时,它显示在设备上数组中的值是 0.0,而不是我在主机端设置的正确值 1.0。这仅适用于数组:标量,如示例中所示,具有正确的值。

我想知道这是否是nvfortran当前 OpenACC 标准或当前 OpenACC 标准的限制?

4

1 回答 1

2

看起来像一个编译器问题,我们没有初始化主机上的小数组。在查看我们现有的错误报告时,我看到一个几乎相同的错误报告,只是使用 C 而不是 Fortran,巧合的是,今天早上在我们的开发编译器中得到了修复。不幸的是,它似乎也无法解决您的问题。我向分配给该问题的编译器工程师发送了一封便条,询问他是否可以看一下。

最坏的情况是,如果问题相似但不相关,我将打开一个新的问题报告并使用跟踪号更新此帖子。

于 2020-10-13T20:20:55.737 回答