win 10 在vs2017下对mpi的安装以及认识

2021-06-10 05:05

阅读:622

标签:代码   添加   recv   sdn   for   例子   har   mpi   sof   

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
#includestring.h>
#include#pragma comment(lib,"msmpi.lib")

int main(int argc, char* argv[])
{
    int proceNum;//进程数量


    int thisId;//当前进程id

    MPI_Status  status;//状态信息

    char message[1024];//发送信息内容

    MPI_Init(&argc, &argv);//初始化mpi进程

    
    MPI_Comm_rank(MPI_COMM_WORLD, &thisId);//获取当前进程号
    
    if (thisId == 0)
    {
        MPI_Comm_size(MPI_COMM_WORLD, &proceNum);//获取进程数量
        
        printf("当前共有%d个进程\n", proceNum);
    }

    if (thisId != 0) //当前进程不是主进程
    {
        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)+1, MPI_CHAR, 0, 9527, MPI_COMM_WORLD); //MPI_COMM_WORLD:包含程序中所有MPI进程

    }
    else {//thisId != 0即不是主进程,那么这里就是主进程
        for (int i = 1; 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, 1024, MPI_CHAR, i, 9527, MPI_COMM_WORLD, &status);


            printf("你好,进程%d\n", status.MPI_SOURCE);
            

        }
    }



    MPI_Finalize();



    return 0;
}

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

解决如下:

原因解释
这种微软的警告,主要因为那些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的安装以及认识

标签:代码   添加   recv   sdn   for   例子   har   mpi   sof   

原文地址:https://www.cnblogs.com/loufangcheng/p/10620558.html

上一篇:C# 事件与委托

下一篇:c# .net 面试总结


评论


亲,登录后才可以留言!