这里我先对MPI进行一下简单的介绍,MPI的全称是Message Passing Interface,即消息传递接口。

  • 它并不是一门语言,而是一个库,我们可以用Fortran、C、C++结合MPI提供的接口来将串行的程序进行并行化处理,也可以认为Fortran+MPI或者C+MPI是一种再原来串行语言的基础上扩展出来的并行语言。

  • 它是一种标准而不是特定的实现,具体的可以有很多不同的实现,例如MPICH、OpenMPI等。

  • 它是一种消息传递编程模型,顾名思义,它就是专门服务于进程间通信的。

MPI的工作方式很好理解,我们可以同时启动一组进程,在同一个通信域中不同的进程都有不同的编号,程序员可以利用MPI提供的接口来给不同编号的进程分配不同的任务和帮助进程相互交流最终完成同一个任务。就好比包工头给工人们编上了工号然后指定一个方案来给不同编号的工人分配任务并让工人相互沟通完成任务。

1.首先MPI是基于消息传递的并行计算模式,与之前的pthread,openMP等共享内存的完全两码事,这是首先要明白的。

2.MPI程序中,既有串行执行的程序,也有并行执行的程序。其中,并行的部分全部放在MPI_Init(&argc,&argv)和MPI_Finalize()内部。(其实外部的程序也都会在每一个进程中运行,此处不太理解内部具体是怎么搞的)

3.也是最让我开始纳闷的地方:MPI 的程序怎么在代码中控制开多少个进程啊?费了我半天劲,原来MPI有自己的编译和运行命令。
最简单的编译命令 mpicc mpi.c -o mpi
最简单的运行命令mpirun -np 4 ./mpi   其中-np就是指定开启的进程数

4.貌似MPI发挥作用是要在集群上运行的,但是单机下也可以运行,用上述命令即可。

还有很多不懂正在学习
---------------------

一、mpi的安装

去微软下载安装
直接下载地址(点击下载)

1 点击下面

2.直接点击下载

3、直接运行msi文件,按照安装提示安装
4、安装后会有3个文件夹

主要是头文件include与库文件lib
5、打开vs2017,创建一个空的.cpp文件

右击上面的那个,调出菜单,找到最下面的“”属性“”

打开是这样子的

3、导入头文件,库文件

(1)头文件

如果是64位选择x86文件夹,32位选x64
(2)库文件夹

导入方式和头文件的一样,不过应该注意的是选文件夹是一定要选x86或者是x64,否则可能会报找不到xxx.lib
(3)添加依赖项

点击小勾,这个地方选中这行是会出现小勾

复制几个xxx.lib的名字依次填进去中间用;隔开或者换行写

最后点击“”应用“”就行

二、mpi的简单运用运用

(1)常用的基本函数

int MPI_Init(int* argc ,char** argv[] );//初始化

int MPI_Comm_size(MPI_Comm comm ,int* size);//进程数

int MPI_Comm_rank(MPI_Comm comm ,int* rank);//当前进程号

int MPI_Send(void *message, int count, MPI_Datatype datatype, int rank, int tag, MPI_Comm comm);//发送信息

int MPI_Recv(void *message, int count, MPI_Datatype datatype, int rank, int tag, MPI_Comm comm, MPI_Status *status);//接受信息

int MPI_Finalize(void);//释放init的资源

(2)函数参数介绍

MPI_Comm comm  通信域,一组共享该空间的进程

     int *size 进程数将会存在里面

     int *rank 进程号将会存在里面,进程号为大于等于0的整数,其中主进程进程号(rank)为0

     void *message 为被发送的信息

     int count  你发送的消息的个数(注意:不是长度,例如你要发送一个int整数,这里就填写1,如要是发
送“hello”字符串,这里就填写6(C语言中字符串未有一个结束符,需要多一位))。 MPI_Datatype datatype 你要发送的数据类型,需要用MPI定义的数据类型 int dest 进程号 int tag 信息标签(当发送的信息标签和接受端的信息标签相等时在,接受端才接受) MPI_Status *status 包含实际接收到的消息的有关信息
(3)简单实例
#include<stdio.h>
#include<string.h>
#include<mpi.h>
#pragma comment(lib,"msmpi.lib") int main(int argc, char* argv[])
{
int proceNum;//进程数量 int thisId;//当前进程id MPI_Status status;//状态信息 char message[];//发送信息内容 MPI_Init(&argc, &argv);//初始化mpi进程 MPI_Comm_rank(MPI_COMM_WORLD, &thisId);//获取当前进程号 if (thisId == )
{
MPI_Comm_size(MPI_COMM_WORLD, &proceNum);//获取进程数量 printf("当前共有%d个进程\n", proceNum);
} if (thisId != ) //当前进程不是主进程
{
printf ("我是进程%d,正在发送......", thisId); sprintf(message, "你好主进程!!");
// int MPI_Send(void *message, int count, MPI_Datatype datatype, int rank, int tag, MPI_Comm comm);发送信息到0进程(主进程)
MPI_Send(message, strlen(message)+, MPI_CHAR, , , MPI_COMM_WORLD); //MPI_COMM_WORLD:包含程序中所有MPI进程 }
else {//thisId != 0即不是主进程,那么这里就是主进程
for (int i = ; i < proceNum; i++)//其实这是阻塞式的发送和接受,所以可以靠循环来读取message所指缓冲区的信息
{
// int MPI_Recv(void *message, int count, MPI_Datatype datatype, int rank, int tag, MPI_Comm comm, MPI_Status *status);//接受信息
MPI_Recv(message, , MPI_CHAR, i, , MPI_COMM_WORLD, &status); printf("你好,进程%d\n", status.MPI_SOURCE); }
} MPI_Finalize(); return ;
}

然后运行,如果在这里出现如下错误

error C4996: 'sprintf': This function or variable may be unsafe.

解决如下:

原因解释
这种微软的警告,主要因为那些C库的函数,很多函数内部是不进行参数检测的(包括越界类的),微软担心使用这些会造成内存异常,所以就改写了同样功能的函数,改写了的函数进行了参数的检测,使用这些新的函数会更安全和便捷。关于这些改写的函数你不用专门去记忆,因为编译器对于每个函数在给出警告时,都会告诉你相应的安全函数,查看警告信息就可以获知,在使用时也再查看一下MSDN详细了解。库函数改写例子:
mkdir改写为 _mkdir 
fopen”改写为 fopen_s 
stricmp改写为 stricmp_s
sprintf改写为sprintf_s

strcpy改写为strcpy_s

方法一:调用VS2005鼓吹的那些带“_s”后缀的非标准函数,即在其后加上"_S",如sprintf改为sprintf_s    。
方法二:在文件最开始添加#define _CRT_SECURE_NO_DEPRECATE或#pragma warning(disable:4996)     ,这是忽略警告的方法(一般比较少用)。
方法三:干粹在工程属性中设置(推荐)。

在工程属性中设置的方法如下:

对于VC6:
打开Project----settings----Resources----Preprocessor definitions,
添加_CRT_SECURE_NO_DEPRECATE和_SCL_SECURE_NO_DEPRECATE这两个宏。

对于VS系列的版本:
打开项目----项目属性---配置属性----C/C++ ----预处理器----预处理定义,
添加_CRT_SECURE_NO_DEPRECATE和_SCL_SECURE_NO_DEPRECATE这两个宏。

成功运行之后:
然后右击左上角蓝色的mai.cpp打开所在文件夹

返回上一级

进入Debug文件夹

空白处shift+鼠标右键,打开菜单然后打开Powershell窗口,输入mpiexec -n 17 mpi.exe,17为进程数将会生成0-16的进程号。

 

结果如下:

win 10 在vs2017下对mpi的安装以及认识的更多相关文章

  1. 在 Win 7或8 下使用 VirtualBOX 虚拟机安装 OS X 10.11 El Capitan 及 Xcode 7.0

    注:本文源自于: http://bbs.feng.com/read-htm-tid-9908410.html _____________________________________________ ...

  2. WIN 10下Mysql 5.7.21解压缩(免安装版)配置

    网上看了N多大神的东西东抄抄西抄抄,老是就不对,因为很多资料不是针对5.7这个版本的内容. 首先解压文件,比如我解压到D:\Program Files\mysql-5.7.21-winx64 第一步: ...

  3. WIN 10环境下JDK的安装和环境配置

    在做测试的过程中,诸如Selenium.Appium.Macaca.Airtest.RobotFramework.Jmeter等框架或工具都需要用到一样基础的环境JAVA JDK.最近刚好换了电脑,就 ...

  4. Win 10环境下6sV2.1模型编译心得

    最新版本6sV2.1模型是通过FORTRAN95编写的,2017年11月代码编写完成,2018年11月发布在模型官网上.通常我们在使用过程中都是调用模型的.exe可执行文件,而下载下来的是FORTRA ...

  5. Win 10 下 android studio显示 Intel haxm无法安装,以及VT-X和hyper-x的冲突问题

               我 的电脑是神舟战神k650c i7 D4,处理器是Intel core i7 4710-MQ,系统是win 10的 我心血来潮想学习一下安卓开发,就首先安装了android s ...

  6. Win 10下安装 Redis

    目录 写在前面 一.安装环境 二.下载windows版本的Redis 三.安装Redis 四.安装服务 五.启动服务 六.测试Redis 七.常用的Redis服务. 写在前面 Redis 是一个开源使 ...

  7. 【Win 10 应用开发】导入.pfx证书

    这个功能其实并不常用,一般开发较少涉及到证书,不过,简单了解一下还是有必要的. 先来说说制作测试证书的方法,这里老周讲两种方法,可以生成用于测试的.pfx文件. 产生证书,大家都知道有个makecer ...

  8. 【Win 10应用开发】Adaptive磁贴模板的XML文档结构

    在若干天之前,老周给大家讲了Adaptive Toast通知的XML模板,所以相应地,今天老周给大家介绍一下Adaptive磁贴的新XML模板. 同样道理,你依旧可以使用8.1时候的磁贴模板,在win ...

  9. 【Win 10 应用开发】RTM版的UAP项目解剖

    Windows 10 发布后,其实SDK也偷偷地在VS的自定义安装列表中出现了,今天开发人员中心也更新了下载.正式版的SDK在API结构上和以前预览的时候是一样的,只是版本变成10240罢了,所以大家 ...

随机推荐

  1. DPDK- program_guide 2

    Data Plane Development Kit(DPDK) RTE_SDK and RTE_TARGET must be configured. ~EAL ~librte_mempool ~li ...

  2. 安装网卡ifconfig不出现问题

    安装万兆网卡,Ethernet controller: Intel Corporation 82599EB 10-Gigabit SFI/SFP+ Network Connection 使用lspci ...

  3. 解决Ubuntu19.04下网易云音乐打不开的问题

    Ubuntu19.04下打开网易云音乐的v18.04版会出现以下错误: opt/netease/netease-cloud-music/netease-cloud-music: symbol look ...

  4. Java第2次作业

    我认为这一次的作业还是比较好的,对自己的学习有很大帮助.

  5. hightcharts详细教程

    1.初始化highcharts var chart = Highcharts.chart('container', options); 2.options 自定义图表的配置项 const option ...

  6. 三大前端框架(react、vue、angular2+)父子组件通信总结

    公司业务需要,react.vue.angular都有接触[\无奈脸].虽然说可以拓展知识广度,但是在深度上很让人头疼.最近没事的时候回忆各框架父子组件通信,发现很模糊,于是乎稍微做了一下功课,记录于此 ...

  7. 30天代码day2 Operators

    Operators These allow you to perform certain operations on your data. There are 3 basic types: Unary ...

  8. NYOJ-15:括号匹配(二)

    内存限制:64MB 时间限制:1000ms 特判: No 通过数:54 提交数:158 难度:6 题目描述: 给你一个字符串,里面只包含"(",")",&quo ...

  9. Go学习之初出茅庐

    在一个月黑风高的夜晚,机缘巧合与Go语言一面之缘,被她的简洁.灵活.高效所吸引,让我有深入学习的冲动,现在开始我的成长之路吧.

  10. linux下 编译安装Mysql

    正文: 一:卸载旧版本 使用下面的命令检查是否安装有MySQL Server rpm -qa | grep mysql 有的话通过下面的命令来卸载掉 rpm -e mysql //普通删除模式 rpm ...