牛骨文教育服务平台(让学习变的简单)
博文笔记

PVF(PGI Visual Fortran) 安装以及openacc在linux和window下调用

创建时间:2015-11-14 投稿人: 浏览次数:2879

1.首先下载软件到这个地址:

http://www.pgroup.com/support/download_pgi2015.php

因为已经安装了vs所以此处选择的只是PGI加速器


下载好文件以后一路安装下去,在下面这个页面能看到PGI也安装到了VS


2.接下来是license 安装,可以选择这里的安装软件获取一个15天免费版的 license key,也可以用教育网邮箱注册账户的时候,发过来的一个start license key,先把自己的主机号记着

我用的license 是在nvida openacc下载编译器的时候免费获取的,学生用的license 可以用一年,不过是单节点的,编译成的二级制文件也不可以移植,不过可以先用来开发,这种license key貌似都是PGI通用的,地址是:

http://www.nvidia.com/object/openacc-toolkit.html#utm_source=shorturl&utm_medium=referrer&utm_campaign=openacctoolkit

1.新建工程,选择PGI  Visual Fortran第一个


然后点击项目属性,选择language ,选择enable openacc 处选为yes,我们可以看到他可以支持很多并行扩展:


将程序加入,编译完成:


命令行也可以使用:


也可以像Linux那样输入-ta=nvidia,time,然后来统计GPU端的时间和参数

<span style="font-size:24px;">program prog
      implicit none
      integer::n=100,m=500,i,j
      real,dimension(:,:),allocatable :: a   //声明数组
      real::w0=2.0,w1=3.0
       allocate( a(n,m) )                         //申请空间         
        do i=1,n
            do j=1,m
                a(i,j)=i*2.0+j*2.0
            end do
        end do

        !$acc region             //!$acc region 和  !$acc end region命令复制到GPU端
        do i=1,n
            do j=1,m
                a(i,j) = w0 * a(i,j) +w1*(a(i-1,j) + a(i+1,j) + a(i,j-1) + a(i,j+1))
            end do
        end do
        !$acc end region

        print*,"finish"
      end program prog</span>


这是复制信息,在!$acc region 后把a复制到GPU端,后面是执行并行

这是赋值和执行的时间。


源程序为:
<span style="font-size:24px;">module vecaddmod
   implicit none
contains
   subroutine vecaddgpu( r, a, b, n )
      real, dimension(:) :: r, a, b
      integer :: n
      integer :: i
   !$acc kernels do copyin(a(1:n),b(1:n)) copyout(r(1:n))
       do i = 1, n
          r(i) = a(i) + b(i)
        enddo
   end subroutine
end module
program main
   use vecaddmod
   implicit none
   integer :: n, i, errs, argcount
   real, dimension(:), allocatable :: a, b, r, e
   character*10 :: arg1
   argcount = command_argument_count()
   n = 1000000 ! default value
   if( argcount >= 1 )then
       call get_command_argument( 1, arg1 )
       read( arg1, "(i)" ) n
       if( n <= 0 ) n = 100000
    endif
allocate( a(n), b(n), r(n), e(n) )
    do i = 1, n
         a(i) = i
          b(i) = 1000*i
     enddo
      ! compute on the GPU
     call vecaddgpu( r, a, b, n )
      ! compute on the host to compare
      do i = 1, n
          e(i) = a(i) + b(i)
      enddo
      ! compare results
      errs = 0
      do i = 1, n
           if( r(i) /= e(i) )then
               errs = errs + 1
           endif
        enddo
       print *, errs, " errors found"
        if( errs ) call exit(errs)
end program</span><span style="font-size:32px;">
</span>


声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。