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 progimplicit 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>
相关文章推荐
- Linux socket 初步
- linux lsof详解
- linux 文件权限
- Linux 执行数学运算
- 10 篇对初学者和专家都有用的 Linux 命令教程
- Linux 与 Windows 对UNICODE 的处理方式
- Ubuntu12.04下QQ完美走起啊!走起啊!有木有啊!
- 解決Linux下Android开发真机调试设备不被识别问题
- 运维入门
- 运维提升
- Linux 自检和 SystemTap
- Ubuntu Linux使用体验
- c语言实现hashmap(转载)
- Linux 信号signal处理机制
- linux下mysql添加用户
- Scientific Linux 5.5 图形安装教程
- 基于 Linux 集群环境上 GPFS 的问题诊断
- 谁是桌面王者?Win PK Linux三大镇山之宝
- vivi下重新调整分区