MPI笔记(一)环境

MPI笔记(一)环境
MPI笔记(二)点对点通信
MPI笔记(三)集合通信
MPI笔记(四)数据类型和派生数据类型
MPI笔记(五)组和通信因子
MPI笔记(六)虚拟拓扑
MPI笔记(七)计算圆周率

代码地址:
https://github.com/BuildSoftwareBetter/MSMPI_test


0. MPI概述

MPI(Message Passing Interface)是一种用于进程间通信的标准接口。在MPI编程中,通过将计算任务分配给多个进程并进行通信,实现并行计算的效果。

并行通常会有以下几个概念:

  • MPI (多进程并行)
  • openmp (多线程并行)
  • SIMD (单指令多数据并行)

1. MSMPI 使用

我用的MSMPI。MSMPI提供了完整的使用说明:How to compile and run a simple MS-MPI program

1.1 使用步骤

1. 下载安装msmpisdk.msi和msmpisetup.exe。
2. 配置VS开发环境(以下是64位程序)
添加 include 目录:$(MSMPI_INC);$(MSMPI_INC)\x64;
添加依赖库目录:$(MSMPI_LIB64);
添加依赖库:msmpi.lib;

msmpisdk安装时已将各个路径写入了环境变量。
在这里插入图片描述
在这里插入图片描述

2. 编写MPI程序

/*
1. MPI 环境
	头文件: mpi.h
	调用格式:	rc = MPI_XXX(parameter,...)
				如果调用成功,rc 返回 MPI_SUCCESS

	程序结构:
		// 包含头文件
		#include "mpi.h"

		// 初始化环境
		MPI_Init(...)

		// 消息交换并处理
		MPI_XXX(...)

		// 退出MPI环境
		MPI_Finalize()

	通信因子和组:
		MPI_COMM_WORLD 所有进程都在MPI_COMM_WORLD通信因子组
		MPI通过指定通信因子和组来完成各个进程间的通信
	秩:
		进程所在通信组中的唯一标识符


	int MPI_Get_my_id() 获取进程ID号
	int MPI_Get_log_id() 获取当前进程所处的逻辑PE号
	void MPI_Get_longtimed(double *dt) 获取系统长时钟(以ms为单位)
	char *MPI_Init_node_shared_mem(int argc,char **argv, long StartAddr,unsigned long MemLen) 初始化节点的共享空间
	char *MPI_Get_node_shared_mem() 获取节点共享空间
	char *MPI_Init_pe_shared_mem(int argc,char **argv, long StartAddr,unsigned long MemLen) 初始化分步共享空间
	char *MPI_Get_pe_shared_mem() 获取分步共享空间


*/

#include "mpi.h"
#include <stdio.h>
#include <iostream>
#include <windows.h>

using namespace std;

int main_1(int argc, char *argv[])
{
	MPI_Init(&argc, &argv);	//根据输入参数初始化环境

	int rank = 0;
	MPI_Comm_rank(MPI_COMM_WORLD, &rank);	// 获取当前进程在MPI_COMM_WORLD通信因子组的秩

	int size = 0;
	MPI_Comm_size(MPI_COMM_WORLD, &size);	// 获取MPI_COMM_WORLD通信因子组包含的进程数

	// MPI_Abort(MPI_COMM_WORLD, 0);	// 结束MPI_COMM_WORLD通信因子组的所有进程

	//Sleep(rank * 1000);

	// 获取当前进程所在处理器的名称
	char process_name[300] = { 0 };
	int process_name_len = 0;
	MPI_Get_processor_name(process_name, &process_name_len);

	double wtime = MPI_Wtime();	// 获取运行时间
	double wtick = MPI_Wtick();	// 获取时间单位(s),如果是毫秒则为0.001

	cout << "current process name: " << process_name << "; process rank: " << rank << "/" << size << "; exec time: " << wtick * wtime << " s" << endl;

	MPI_Finalize();	// 结束MPI执行环境

	return 0;
}

3. 运行MPI程序

控制台进入C:\Program Files\Microsoft MPI\Bin文件夹(根据msmpisetup.exe安装目录),使用mpiexec运行程序:

参数:-n 4 ,开启4个线程

C:\Program Files\Microsoft MPI\Bin>mpiexec.exe -n 4 d:\MPI\code\MSMPI\x64\Debug\MSMPI_test.exe
current process name: DESKTOP-F4U0006; process rank: 0/4; exec time: 0.0272527 s
current process name: DESKTOP-F4U0006; process rank: 2/4; exec time: 0.0272527 s
current process name: DESKTOP-F4U0006; process rank: 3/4; exec time: 0.0272527 s
current process name: DESKTOP-F4U0006; process rank: 1/4; exec time: 0.0272527 s
  • 5
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值