在Fortran90内部程序上使用例程指令

在Fortran90内部程序上使用例程指令,fortran,openacc,Fortran,Openacc,我已授予OpenAcc访问名为“lang_force”的子例程的权限,并在该子例程中调用Fortran90内在随机数() 当使用最新版本的pdf90编译时,它告诉我它需要访问RANDOM_NUMBER()。如何向这样的Fortran 90内部子例程声明例程指令?并非所有Fortran内部函数都在设备代码(包括随机数)中受支持 subroutine lang_force(damp, temp, noise) !$acc routine(lang_force) implicit none

我已授予OpenAcc访问名为“lang_force”的子例程的权限,并在该子例程中调用Fortran90内在随机数()


当使用最新版本的pdf90编译时,它告诉我它需要访问RANDOM_NUMBER()。如何向这样的Fortran 90内部子例程声明例程指令?

并非所有Fortran内部函数都在设备代码(包括随机数)中受支持

subroutine lang_force(damp, temp, noise)
  !$acc routine(lang_force)
  implicit none
  double precision, intent(in) :: damp, temp
  double precision, dimension(1:3), intent(out) :: noise
  double precision :: kb, a1, theta, phi, mag1, pi,r,s
  integer :: i,j,k
  double precision :: x,y,z

  kb = 1.3806E-23
  !kb = 1.0
  pi=4.D0*DATAN(1.D0)

  call random_number(a1)
  call random_number(r)
  call random_number(s)
  mag1 = sqrt(-2.0*log(a1))


  theta = r*pi
  phi = 2.0*s*pi
  x = mag1*cos(phi)*sin(theta)
  y = mag1*sin(theta)*sin(phi)
  z = mag1*cos(theta)

  noise(1) = sqrt(2.0*kb*temp*damp)*x
  noise(2) = sqrt(2.0*kb*temp*damp)*y
  noise(3) = sqrt(2.0*kb*temp*damp)*z
end subroutine lang_force
由于所有线程都将共享相同的状态,所以随机_数尤其不是线程安全的。相反,您需要使用cuRand,我们在“2020/examples/CUDA Libraries/cuRand/test\u rand\u oacc\u ftn”目录下随编译器提供示例

<>这是在C,我写的是关于英伟达用户论坛:

欢迎光临,请拿起话筒阅读。它到底说明了什么?请复制并粘贴与打印时完全相同的错误消息。内部版本是否应该与OpenACC兼容?我有点怀疑。代码看起来不错,所以问题可能在于编译器选项。