visual studio 2019& Intel Parallel Studio XE2020下FORTRAN安装及MPI并行配置计算
实现步骤
下载安装包
visual studio 2019版本的下载
(1)visual studio 2019版本的下载,下载地址如下:
https://visualstudio.microsoft.com/zh-hans/vs/
下载界面如图:
共有三个版本可供选择,community版本适合个人使用,并且免费;professional版本和enterprise版本都需要序列号,
我在这里选择了专门面向程序开发人员的professional版本并进行下载
intel parallel studioXE2020下载
(2)intel parallel studioXE2020下载,我下载的是集群版本的,为了做MPI;具体的下载途径可以百度(我的是直接从别人copy来的)。
安装过程
!!!重要!!!
必须先安装visual studio2019,后安装intel parallel studioXE2020。
visual studio 2019版本的安装
这里因为我已经安装好了,所以只有修改选项,如果是首次安装,只需要在选项中选择C++的那个即可,其余的默认点击右下角安装就好
安装好之后,输入序列号认证(如果是communnity版本就不用认证),激活之后,关掉界面。进行后续安装
intel parallel studioXE2020安装
可以参考这里百度经验上面对2918版本的安装步骤https://jingyan.baidu.com/article/37bce2be5efc901002f3a216.html
因为我需要使用MPI和VTune等功能,所以我在选择时把所有的功能全都选上了。
安装完成后可以选择一个fortran很简单的例子测试并运行一下看看是否正常,比如hello world
MPI相关配置
新建项目步骤
文件>>新建>>项目
>>下一步
>>创建
在source files右键>>添加>>新建项
>>添加
这样就创建好了,就可以直接在里面写代码,编译运行。但是在这之前,需要对MPI进行编译环境配置
配置步骤
文章的信息,主要来源于官网,一定要按照步骤准确配置,否则会出现许多错误。
https://software.intel.com/content/www/us/en/develop/documentation/mpi-developer-guide-windows/top/introduction.html
(1)安装mpi库,因为我已经在XE2020里面选择了此选项,所以不必重新安装;
(2)设置MPI库环境:直接双击运行批处理文件:vars.bat,我的在C:\Program Files (x86)\IntelSWTools路径下面搜索,然后找到。
(3)在电脑搜索框输入cmd,以管理员身份运行,输入hydra_service -status,以确保hydra_service正在运行
如果不是正在运行的话,可以输入hydra_service -install,
这样再输入hydra_service -status的话,显示的就是在运行了,
(4)注册用户的凭证信息,并保存在注册表中。输入mpiexec -register,然后输入自己设置的用户名,密码,确认密码,回车出现保存
这里其实还有两种其他办法,不用输入用户名和密码,但是需要修改设置,而且会耗费时间,所以不符合并行的目的,我没有选择。
(5)找到compilervars.bat双击运行。
(6)找到 mpivars.bat双击运行。
(7)在console上右键>>属性
(8)配置属性> Debugging下修改:
Command: KaTeX parse error: Undefined control sequence: \intel at position 13: (I_MPI_ROOT)\̲i̲n̲t̲e̲l̲64\bin\mpiexec.…(TargetPath)"
针对我自己的文件夹,commond是:C:\Program Files (x86)\IntelSWTools\compilers_and_libraries_2020.1.216\windows\mpi\intel64\bin\mpiexec.exe
Command arguments是:-n 4 “$(TargetPath)” ,代表4各核计算。
修改后点击应用
(9)在fortran>general下,修改Additional Include Directories: $(I_MPI_ROOT)\intel64\include
针对我自己的文件夹,C:\Program Files (x86)\IntelSWTools\compilers_and_libraries_2020.1.216\windows\mpi\intel64\include
修改后点击应用
(10)在linker>general下,修改Additional Library Directories: $(I_MPI_ROOT)\intel64\lib<configuration>,其中,的选项可以是debug或者是release,
( release : multi-threaded optimized library
debug : multi-threaded debug library)
因为我的是debug模式,所以我的文件夹是,C:\Program Files (x86)\IntelSWTools\compilers_and_libraries_2020.1.216\windows\mpi\intel64\lib\debug
修改后点击应用
(11)在linker>input下,修改Additional Dependencies: impi.lib
修改后点击应用
(12)点击确定
(13)选择一个较为简单的mpi的fortran程序粘贴进去,如
! 简单的 MPI 并行程序 Fortran 实现示例! ! – by Jackdaw ! – QQ 群 Fortran Coder(2338021)! – 2018 10 24 ! ! 任意进程间相互问候!
program main
use mpi
implicit none
integer :: myid, numProcs, nameLen, ierr
character(len=mpi_max_processor_name) :: p_name
call mpi_init( ierr ) ! 完成 MPI程序 的初始化工作
call mpi_comm_rank( mpi_comm_world, myid, ierr ) ! 获取当前进程标识号
call mpi_comm_size( mpi_comm_world, numProcs, ierr ) ! 获取通信域包含的进程数
if( numProcs .lt. 2 ) then
write(*,*) "System requires at least 2 processors."
call mpi_abort( mpi_comm_world, 1, ierr )
end if
call mpi_get_processor_name( p_name, nameLen, ierr ) ! 获取运行当前进程的机器名
write(*,*) "Processor ",myid," is alive on ",p_name(1:nameLen),"."
call sleep(1)
call mpi_barrier( mpi_comm_world, ierr )
call hello()
call mpi_finalize( ierr ) ! 完成 MPI程序 的结束工作
end program main
! ############################################################################## !
! 任意两个进程间交换信息,问候信息由发送进程标识和接收进程标识组成!
! ##############################################################################
subroutine hello()
use mpi
implicit none
integer :: nproc, me, type = 1
integer :: buffer(2), node
integer :: istat( mpi_status_size ), ierr
call mpi_comm_rank( mpi_comm_world, me, ierr )
call mpi_comm_size( mpi_comm_world, nproc, ierr )
if( me .eq. 0 ) then
write(*,*) "Hello test from all to all."
end if
do node = 0, nproc-1
if( node .ne. me ) then
buffer(1) = me
buffer(2) = node
! 首先将问候信息发出
call mpi_send( buffer, 2, mpi_integer, node, type, mpi_comm_world, ierr ) ! 消息发送
! 然后接收被问候进程对自己发送的问候信息
call mpi_recv( buffer, 2, mpi_integer, node, type, mpi_comm_world, istat, ierr ) ! 消息接收
if( buffer(1) .ne. node .or. buffer(2) .ne. me ) then
write(*,*) "Hello: ",buffer(1)," = ",node," or ",buffer(2)," = ",me
write(*,*) "Mismatch on hello processors; node = ",node
end if
write(*,*) "Hello from ",me," to ",node,"."
end if
end do
end subroutine
(14)生成>>生成解决方案
(15)调试>>开始执行不调试
备注:还有一个重要的问题是版本的问题
在我的运行中,我设置的版本信息如下:
右键解决方案>>属性>>配置管理器
如果之前平台是win32,可以点小箭头然后新增,就有X64了。
结束
研究了两天,终于成功了,走了很多弯路,最大的感受是,最好还是按照官网上面官方版本的说明进行操作,不要觉得差不多版本操作就一样,还是有一些不同的。
学习之路,漫漫长夜,终见黎明。
转载请注明出处,谢谢。