MPI落地

如果前面的方法都没有用,没有关系。我们这边直接来一个微型mpi环境的搭建,一切为了运行自己的第一个mpi程序。

通用操作:

mpi下载

进入官网以后点击download,将里面的msmpisetup.exemsmpisdk.msi都下载下来。这里默认下载下来以后一直点的是确认,没有修改安装地址,如果有修改,根据笔者的代码自行修改地址那边的信息。

mingw64-8.1.0

注意往下拉,找到x86_64-posix-seh,点击下载,最好是64位的,好像32位不是很匹配。以及环境变量的配置,一样找到我的电脑(此电脑),右键选择属性,然后找到高级系统设置,然后找到环境变量,点进去。

在用户变量和系统变量找到path,然后刚才下载下来的x86_64-posix-seh,解压完成之后,找到里面的文件夹bin,比如笔者的就是C:\Program Files\mingw64\bin,也就是我将mingw64放在了C盘的program files下,然后在每个path下加入就可以了。

检验的过程就是仍然是同时按win+R,唤出dos系统,输入gcc --version,如果在一大堆英文中看到8.1.0就说明安装以及配置环境变量成功了。

vscode

vscode

一进宫

推荐去官网下载,点击download即可,里面的配置可以放心选择默认。如果下载完vscode,可以唤出dos系统,然后输入code -v,如果第一行是版本号,第三行是x64说明安装成功了。

二进宫

这里第一次打开vscode是英文界面,不熟悉的同学没有关系,往右边的悬浮窗口寻找,找到第五个扩展,或者直接Ctrl+Shift+X,在里面输入Chinese,然后下载应用就可以了,记得做完退出再进来就是中文界面了。

三进宫

接下来一样的操作,仍然是在拓展窗口,这时候我们搜索code runner,下载并且应用,点确认就可以了。然后依然是退出再进去。

我不来啦

最后一次进去,点击拓展界面,这时候应该能看到code runner在你的搜索栏下面,这时候右键,找到拓展设置点击,然后在里面找到这个Code-runner:Executor Map,如果觉得麻烦,直接Ctrl+F,然后再那个框中粘贴Code-runner:Executor Map,按个回车就能找到了,然后点击下面的在setting.json中编辑,找到里面的:

"c":"...."
"cpp":"...."

我们要修改的就是这个。

造宫殿

将原先的替换成下面的:

"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",

注意这里面的MS-MPI库的位置(\"C:\\Program Files (x86)\\Microsoft SDKs\\MPI\\Lib\\x64\"\"C:\\Program Files (x86)\\Microsoft SDKs\\MPI\\Include\"),尤其注意"\之前都要加上转义符号\,否则vscode后面运行的时候会出现no this file or directionary,这边也可以按照自己之前下载的位置找到x64Include对应替换就可以了

运行自己的第一个mpi程序

拷贝下面程序,然后在vscode上运行,记着点击右上角的三角,或者直接Ctrl+Alt+N,就可以测试自己的mpi环境搭建的如何了。

#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);
  cout << "Hello World! Process" << myid << "of" << numprocs << " on " << processor_name << endl;
  MPI_Finalize();
  return 0;
}

如果输出为

hello
hello
hello
hello
Hello World! Process0of4 on ...
Hello World! Process1of4 on ...
Hello World! Process2of4 on ...
Hello World! Process3of4 on ...

这里的...每个人可能不一样,应该是硬件的一种编号,大致类似就可以了。接下来就可以mpi的探索之旅啦。

DevCPP

又是我们梦开始的dev,不过因为目前dev的mingw64版本是5.11,编译mpi程序的时候会有错误,所以我们要给自己的dev升级一下。

告别往昔

点击Tools,在点击Compiler Options,进入编译器选项界面后,右上角从左到右点击第三个Add a compiler set by folder,然后找到前面下载的mingw64文件夹,点击确定。然后再点从左到右第四个(向右的箭头)Rename the selected compiler set,为自己新搭建的编译器起个名字。注意,如果以后想要换回以前的编译环境,可以往上面的菜单栏中找到help,往下一行最右边,就会看到刚才自己为编译器起的名字,这时候点击,然后选择里面的第一个就是以前自己的编译器环境,以后切换可以在这边实现。或者就是在刚才的Compiler Options里面的第一栏点击选择就可以了。

浴火重生

Add the following commands when calling the compiler里面添加下列代码:

-L "C:\Program Files (x86)\Microsoft SDKs\MPI\Lib\x64" -I "C:\Program Files (x86)\Microsoft SDKs\MPI\Include"

注意这里面的MS-MPI库的位置("C:\Program Files (x86)\Microsoft SDKs\MPI\Lib\x64"和`"C:\Program Files ,这边也可以按照自己之前下载的位置找到x64Include对应替换就可以了

注意修改之前先在之前打勾,不然没法选择。

接着就是在下面的Add the following commands when calling the linker中改成下面的语句:

-static-libgcc -fopenmp -l msmpi

这里的-fopenmp是为了运行omp,而-l msmpi是为了运行mpi,根据自己的需要自行选择。

偷懒是一辈子的事情

这时候理论上可以开始运行自己的第一个mpi程序了,但是还不够方便,因为此时编译运行是没有并行的感觉,所以我们还要进行一步操作。

点击Tools,再点击Configure Tools,点击里面的Add,下面的内容copy即可

标题

需要填写的内容

Title

MPI RUN FOR 4

Program

C:\Windows\System32\cmd.exe

Working Directory

C:\Windows\System32\

Parameters

/c cd/d <PROJECTPATH> & mpiexec -n 4 <EXENAME> & "<EXECPATH>ConsolePauser.exe"

这边的parameters里面的数字4就是我们同时运行的线程有多少,这里可以根据自己的需要自行修改

运行自己的第一个mpi程序

拷贝下面程序,然后在dev运行,注意先编译,然后点击Tools,然后选择里面的Package Manager,点击自己刚刚搭建的MPI RUN FOR 4,就可以测试自己的mpi环境搭建的如何了。

#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);
  cout << "Hello World! Process" << myid << "of" << numprocs << " on " << processor_name << endl;
  MPI_Finalize();
  return 0;
}

如果输出为

hello
hello
hello
hello
Hello World! Process0of4 on ...
Hello World! Process1of4 on ...
Hello World! Process2of4 on ...
Hello World! Process3of4 on ...

这里的...每个人可能不一样,应该是硬件的一种编号,大致类似就可以了。接下来就可以mpi的探索之旅啦。