这里我先对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. Web应用程序的安全问题

    常规的安全问题主要分为以下几大类 一,跨站脚本攻击(XSS) 指的是攻击者向web页面注入恶意的Javascript代码,然后提交给服务器,但是服务器并没有做校验和转义等处理,随即服务器的响应页就被植 ...

  2. 2.7 while 、for 循环控制语句

    一.while语句: 在程序中,需要重复性的做某件事: 1.1.1 while: public class Test{ public static void main(String[] args){ ...

  3. systemd的新特性及unit常见类型分析与awk用法示列

    简述systemd的新特性及unit常见类型分析,能够实现编译安装的如nginx\apache实现通过systemd来管理 系统引导的新特性 系统引导时实现服务启动: 按需激活进程: 系统状态快照: ...

  4. elipse使用,Java和Javaee模式区别

    Java带有用户界面的基本ide,缺少数据库和web开发工具 IDE(Integrated Development Environment,集成开发环境).集成开发环境(简称IDE)软件是用于程序开发 ...

  5. 使用JenKins实现自动执行python脚本

    1.使用Jenkins创建一个工程,工程主要配置项参照下图,其他配置项恢复默认 2.工程配置完成之后,点击[立即构建],执行完成后进入到控制台查看是否执行成功.

  6. Python map,filter,reduce函数

    # -*- coding:utf-8 -*- #定义一个自己的map函数list_list = [1,2,4,8,16] def my_map(func,iterable): my_list = [] ...

  7. Space Invaders 太空侵略者

    发售年份 1978 平台 街机 开发商 Taito 类型 射击 https://www.youtube.com/watch?v=MU4psw3ccUI

  8. 用户id,组id和文件访问权限

    实际用户ID和实际组ID:标示了我们究竟是谁,这两个字段在登录时取自口令文件中的登录项 有效用户ID和有效组ID以及附属组ID:决定了我们的文件的访问权限(通常有效用户ID等于实际用户ID,有效组ID ...

  9. pyhanlp:hanlp的python接口

    HanLP的Python接口,支持自动下载与升级HanLP,兼容py2.py3. 安装 pip install pyhanlp 使用命令hanlp来验证安装,如因网络等原因自动安装失败,可参考手动配置 ...

  10. MVC 验证规则扩展(当RoleID 属性值为A,B 时,Email 属性必填)

    public class RoleRequiredAttribute : ValidationAttribute, IClientValidatable { public string RoleIDS ...