【高性能计算】完美解决Windows下安装mpi环境并应用到VSCode中报错问题的方法

最近在做高性能计算的相关实验,为了实现并行化,我使用了MPI方法。为了让实验能够更加充分得到验证,我希望自己能够从Windows和Linux两个操作系统环境下来进行并行化加速。如题所示,我使用的工具是VSCode(其实按理来说VS2019更方便,但是我没有)。在越过了很多个坑之后,我终于让MPI方法在VSCode上完美运行,于是想要写一篇博客进行记录,并帮助在这个问题上会遇到坑的朋友们。

为了本篇博文的完整性,我将所有流程一一呈现。
安装教程参考:
vscode上配置ms-mpi(轻量级的ms-mpi开发环境)
Windows系统下在VSCode中配置MPI开发环境

1.安装MinGW64环境

一定要按照MinGW64,而不是MinGW32,至于原因我没有深入了解,也是看其他博主所说的。关于MingGW64环境的安装方法其实在CSDN上有很多,为了方便,在这里把安装包发给大家:
链接:https://pan.baidu.com/s/1obu_ITAurDLIlJq5NXSwJw?pwd=0927
提取码:0927

根据教程安装好以后,在命令行界面输入:

g++ --version
gcc --version

出现以下的提示则代表安装完成。
在这里插入图片描述

2.下载MSMPI安装包

安装包其实可以通过微软的官网进行下载:微软官网下载链接
此处我是通过GitHub链接来下载的:GitHub Microsoft-MPI下载链接
可以点击msmpisdk.msi或者msmpisdk.exe来进行下载,.msi版本是.exe版本的轻量级,.exe里所包含的软件环境更加全面,包含了.msi的所有环境。对于MSMPI,点击二者任一版本即可,安装流程和结果相同。
在这里插入图片描述
安装完毕后,打开命令行输入:

set MSMPI

运行结果如下所示,以下展示了MSMPI安装好之后的几个环境变量。
在这里插入图片描述
在这里插入图片描述

3.在VSCode中安装Code Runner插件

打开VSCode,点击扩展区,搜索Code Runner并下载。下载完毕后,在扩展里进行搜索code-runner。如果搜索不到的话,可以通过点击Code Runner处的设置icon,点击扩展设置来搜索:
在这里插入图片描述

在扩展中找到 Code-runner:Executor Map,点击在setting.json中编辑

在这里插入图片描述
在这里插入图片描述

将框出的部分改为:

“c”: “cd $dir && gcc $fileName -o $fileNameWithoutExt -fopenmp -l msmpi -L “C:\Program Files (x86)\Microsoft SDKs\MPI\Lib\x64” -I “C:\Program Files (x86)\Microsoft SDKs\MPI\Include” && mpiexec -n 4 $fileNameWithoutExt”,
“cpp”: “cd $dir && g++ $fileName -o $fileNameWithoutExt -fopenmp -l msmpi -L “C:\Program Files (x86)\Microsoft SDKs\MPI\Lib\x64” -I “C:\Program Files (x86)\Microsoft SDKs\MPI\Include” && mpiexec -n 4 $fileNameWithoutExt”,

一定要注意对应自己安装MSMPI的路径。

4.将mpi.h变为绝对路径解决引入文件飘红、msmpi.dll找不到问题

在完成上述操作之后,就可以引入mpi头文件了。可是我们会发现引入头文件之后文件存在问题:# include <mpi.h>会飘红。如果我使用g++来进行运行,打开生成的.exe文件,会有:找不到msmpi.dll的问题
在这里插入图片描述

为了解决这个问题,我们引入绝对路径:

在这里插入图片描述
在这里插入图片描述

虽然#include<mpi.h>有波浪线,但是可以用Run Code运行。有波浪线的原因是安装c++扩充包,c++扩充包没有mpi.h的头文件路径,这时你加上路径,波浪线就会消失。

5.使用Code Runner插件运行程序

在我们之前对MPI进行一系列操作之后,我们便可以使用Run Code来运行了。

在这里插入图片描述

此处我的运行demo来自于我参考的博文,如下:

#include <iostream>
#include "C:\Program Files (x86)\Microsoft SDKs\MPI\Include\mpi.h"
#include <stdint.h>
using namespace std;

int main(int argc,char* argv[]){
    
    
    cout<<"hello"<<endl;
    int myid, numprocs;
    int namelen;
    char processor_name[MPI_MAX_PROCESSOR_NAME];
    MPI_Init(&argc,&argv);
    MPI_Comm_rank(MPI_COMM_WORLD,&myid);
    MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
    MPI_Get_processor_name(processor_name,&namelen); 
    std::cout<<"Hello World! Process "<<myid<<" of "<<numprocs<<" on "<<processor_name<<std::endl;
    MPI_Finalize();
    return 0;
}

如果出现以下结果,则代表运行成功。

在这里插入图片描述

6.解决VSCode乱码

一个程序的正确运行必然是离不开许多的弯弯绕绕,在我得到正确运行之前,运行结果是这样的:

在这里插入图片描述

在这里插入图片描述
出现这样的结果,有两个原因:
1)使用的g++命令不正确;
为了让程序跑起来,除了Run Code方法以外,也能在终端使用g++*(C++语言使用g++,C语言使用gcc)*命令。如图1,我输入了不正确的g++命令,出现了Dwarf Error
之前(错误示范):

g++ mpitestprogram.exe -o mpiprogram.cpp -fopenmp -l msmpi -L "C:\Program Files (x86)\Microsoft SDKs\MPI\Lib\x64" -I \"C:\Program Files (x86)\Microsoft SDKs\MPI\Include"

之后(正确):

g++ mpitestprogram.cpp -o mpitestprogram -fopenmp -l msmpi -L "C:\Program Files (x86)\Microsoft SDKs\MPI\Lib\x64" -I \"C:\Program Files (x86)\Microsoft SDKs\MPI\Include"

解决方案参考:Dwarf Error

详细知识可以参考博文:linux下使用g++编译.cpp文件的四个过程及使用第三方库编译、g++和gcc的区别、g++和cmake的区别

2)电脑未进行字符集通配设置;
如图2,我在运行的时候出现了乱码。其实遇到乱码我们可以猜测会与Unicode字符集有关。我们需要在电脑设置中,勾选选项:使用Unicode UTF-8提供全球语言支持。
解决过程详见:VS code(Visual Studio Code)乱码解决

在这里插入图片描述

至此,博主遇到的问题已陈述完毕。如果有什么其他问题,欢迎各位在评论区进行交流。

猜你喜欢

转载自blog.csdn.net/weixin_45942927/article/details/125167460
今日推荐