您的位置:首页 > 运维架构 > Linux

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

2015-11-14 17:35 701 查看


1.  PVF(PGI VisualFortran)安装

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

2.PVF新建工程

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



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



将程序加入,编译完成:



命令行也可以使用:



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


3.PVF调试实例

<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端,后面是执行并行


这是赋值和执行的时间。

linux下openacc的例子



源程序为:

<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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息