1 正常配置流程
1.1 配好C++
超简单视频教程建议
1.1.1 下载mingw-w64、配置环境变量
1.1.2 安装C/C++Compile Run插件
1.1.3 配置C/C++Compile Run插件,主要是配置gcc.exe、g++.exe、gdb.exe的路径
1.2 安装MPI库
参考教程
但是这教程写的该说不说,流程是对的,但是还是有问题
我这里总结、修改一下
1.2.1 下载安装Microsoft MPI
下载地址
就安装最新版吧,下载两个文件msmpisetup.exe和msmpisdk.msi,无先后顺序地分别安装这两个文件,安装的地址可以随便改。
简单介绍一下:sdk(Software Development Kit,软件开发工具包),因此
这个Microsoft MPI包括了mpi.h、omp.h(意味着不需要再配置openmp)等
安装完后理论上已经给加入环境变量了,在cmd中输入 set msmpi 应该是下图的结果
1.3 VScode配置MPI库
1.3.1 运行mpi程序的过程
简单介绍一下运行mpi程序的过程,你有一个写了mpi的cpp文件,会先用编译器进行编译(这里就是g++.exe),编译完后生成一个可执行文件exe,然后再用mpiexec去运行这个exe文件。
是不是听起来挺简单的?确实过程很简单,但是目前麻烦就是麻烦在编译的过程,工具确实是g++,但是为了能够找到mpi运行所需要的各种库文件什么的,你需要指定很多的参数,才能正常、正确编译。(表达可能不专业,但是大致是这个意思)
根据目前网上的我看到的教程,当使用mingw-w64编译器时,你需要指定以下参数
网址
具体到命令就是
g++ 文件名.cpp -o 文件名 -I mpi的Include路径 -L mpi的Lib/x64路径 -lmsmpi
下面举一个实际的例子
下面是一个调用MPI接口的test.cpp文件
#include <iostream>
#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;
}
定位到test.cpp所在位置,在终端输入以下编译命令
g++ test.cpp -o test -I E:\\Lib\\mpi\\Include -L E:\\Lib\\mpi\\Lib\\x64 -lmsmpi
如果没有报错就是编译成功了,在同样的位置下生成test.exe
然后在终端用下面命令运行
mpiexec test
也可以指定进程数
mpiexec -n 4 test
如果是像我这样的运行结果就对了
1.3.2 VScode配置mpi
按照上面1.3.1说的其实就可以实现mpi开发了,那么为什么还需要配置呢?其实这是为了方便,每次编译都指定一大串的参数太麻烦了,所以就通过配置这些参数,实现每次编译运行的时候都默认加上了这些参数,来简化这个过程。
这里有两种方式
首先把msi的Include加入到c++的includePath里
方式一 task.json中加入这些参数
task.json就是控制如何编译c/c++的配置文件,里面的args关键字就指定编译的参数。在两个args的位置(分别对应c、c++的编译),加入下面的内容。
但是这种方式会让你在当前文件夹下的所有cpp、c都按照这个进行编译。
这种方式按下图方式编译
方式二
安装插件Code Runner,以后运行都通过这个插件,这个插件可以用在很多种编译语言上,并设置如何运行。
配置的内容
"c": "cd $dir && gcc $fileName -o $fileNameWithoutExt -lmsmpi -L E:\\Lib\\mpi\\Lib\\x64\\ -I E:\\Lib\\mpi\\Include\\ && mpiexec -n 4 $fileNameWithoutExt",
"cpp": "cd $dir && g++ $fileName -o $fileNameWithoutExt -lmsmpi -L \"E:\\Lib\\mpi\\Lib\\x64\" -I \"E:\\Lib\\mpi\\Include\" && mpiexec -n 4 $fileNameWithoutExt",
或者路径不要引号
"c": "cd $dir && gcc $fileName -o $fileNameWithoutExt -lmsmpi -L E:\\Lib\\mpi\\Lib\\x64\\ -I E:\\Lib\\mpi\\Include\\ && mpiexec -n 4 $fileNameWithoutExt",
"cpp": "cd $dir && g++ $fileName -o $fileNameWithoutExt -lmsmpi -lmsmpi -L E:\\Lib\\mpi\\Lib\\x64\\ -I E:\\Lib\\mpi\\Include\\ && mpiexec -n 4 $fileNameWithoutExt",
这里用插件,不仅配置了参数,而且指定了如何运行的。
后面就通过下面的方式来运行
这种方式的不好的地方在于指定了多少个进程运行,想改得去setting.json中改。
2 碰到的坑
json的坑
最开始我就是按照教程来写入json文件的
教程里面是这样的
"cpp": "cd $dir && g++ $fileName -o $fileNameWithoutExt -lmsmpi -lmsmpi -L "E:\\Lib\\mpi\\Lib\\x64" -I "E:\\Lib\\mpi\\Include\\" && mpiexec -n 4 $fileNameWithoutExt",
这是错的,要不然把路径的引号去了,要不然就在前引号和后引号之前都加上反斜杠。
因为不懂json的语法,导致我一直没配成功