MPI 并行

article/2025/9/13 14:46:16

MPI

from b站视频 超算小白-灵犀学院 click

(一)基本框架

头文件 mpi.h

#include "mpi.h"

初始化函数:MPI_Init( )

MPI_Init(int *argc, char ***argv)

完成MPI程序初始化工作,通过获取main函数的参数,让每一个MPI进程都能获取到main函数
MPI_Init函数要在调用其他MPI函数之间调用
指示系统完成所用函数初始化工作(mpi库)

通信域概念

通信域提供了在进程之间传递消息的环境
world是最大的一个通信域,且是系统默认的一个通信域

在一个通信域中进程的序号是有序的,一个进程的序号是它在整个排序过程中的位置
eg.一个通信域包含了p个进程,编号 0~p-1

获取进程标号:MPI_Comm_rank( )

MPI_Comm_rank(MPI_Comm comm, int *rank) //通信域  返回值

用于获取调用进程在给定的通信域中的进程标识号

序号决定计算哪个过程

返回进程总数:MPI_Comm_size( )

MPI_Comm_size(MPI_Comm comm,int *size)

调用返回给定的通信域中所包含的进程总数

清除函数:MPI_Finalize(void)

MPI程序的最后一个调用,清除全部MPI环境

mpi程序编译:

mpicc -O2 -o helloworld helloworld.c (gcc)
mpiicc -O2 -o helloworld helloworld.c (intel)mpicxx -O2 -o helloworld helloworld.cpp (gcc)
mpiicpc -O2 -o helloworld helloworld.cpp (intel)

mpi程序运行命令:

mpirun (mpiexec) -np 进程数 可执行文件

集群mpi上运行
集群作业调度系统特定参数 + 可执行文件

use: (linux)

mpicc -o test mpitest.c
mpirun -np 4 ./test

在这里插入图片描述
在这里插入图片描述

(二)通信函数

1.MPI点对点通信函数

在一对进程之间传递数据
类型:阻塞(消息从本地发出之后才执行后面的语句)和非阻塞(通信于计算的重叠,但调用的返回不保证资源的可在用性)

发送函数:MPI_Send( )

MPI_Send(void* buf,int count,MPI_Datatype datatype,int dest,int tag,MPI_Comm comm)

将发送缓冲区buf中count个datatype数据类型的数据,发送给comm通信域中的标识为dest,消息标志为tag的进程

buffer发送缓冲区的一个起始地址

datatype: eg.int double float…

接收函数:MPI_Recv( )

MPI_Recv(void* buf,int count,MPI_Datatype datatype,int source,int tag,MPI_Comm comm,MPI_Status *status)

从comm通信域中标识号为source的进程,接收消息标记为tag,消息数据类型为datatype,个数为count消息并存储在buf缓冲区中,并将该过程的状态信息写入status中

多了一个mpi状态的一个参数 status

ps. 在C语言中,status是一个结构体,包含 MPI_SOURCE、MPI_TAG、MPI_ERROR信息

非阻塞通信:
在这里插入图片描述

发送函数(非阻塞): int MPI_Isend( )

int MPI_Isend(void* buf,int count,MPI_Datatype datatype,int dest,int tag,MPI_Comm comm,MPI_Request *request)

在这里插入图片描述

与MPI_Send相比多了一个请求的操作,OUT request用于判读非阻塞通信是否完成

接收函数(非阻塞):int MPI_Irecv( )

int MPI_Irecv(void* buf,int count,MPI_Datatype datatype,int source,int tag,MPI_Comm comm,MPI_Request *request)

在这里插入图片描述

栗子:
在这里插入图片描述

2.MPI集合通信函数

请添加图片描述

广播函数:MPI_Bcast( )

MPI_Bcast(*buffer,count,datatype,root,comm)

从指定的一个跟进程中把数据广播发送给组中的所有其他进程

MPI_Bcast{void *data_p;int cout;MPI_Datatype datatype;int source_proc;MPI_Comm comm;
}

影响data缓冲区中的数据
请添加图片描述

收集函数:MPI_Gather( )

MPI_Gather(*sendbuf,sentcnt,sendtype,*recvbuf,recvcount,recvtype,root,comm)

在组中指定一个进程收集组中所有进程发来的消息,这个函数操作与 MPI_Scatter函数操作相反

MPI_Gather{void *send_data;   //数据起始位置int send_count;    //取出的数据量MPI_Datatype send_datatype;  //类型
//发送到根节点接收进程的地方void *recv_data;int recv_count;MPI_Datatype recv_datatype;int root;          // 根结点MPI_Comm communicator;  //通信域
}

请添加图片描述ps.根的缓冲区要大

分发函数:MPI_Scatter( )

MPI_Scatter(*sendbuf,sendcnt,sendtype,*recvcnt,recvtype,root,comm)

mpi 分发函数,把指定进程中的数据分散发送给组中的所有进程(包括自己)

MPI_Scatter{void *send_data;int send_count;MPI_Datatype send_datatype;void *recv_data;int recv_count;MPI_Datatype recv_datatype;int root;MPI_Comm communicator;
}

在这里插入图片描述

规约函数:MPI_Reduce( )

MPI_Reduce(*sendbuf,*recvbuf,count,datatype,op,root,comm)

在组内所有进程中,执行一个规约操作,并把结果存在指定的一个进程中

MPI_Reduce{void *send_data;void *recv_data;int count;MPI_Datatype datatype;MPI_Op op;          // newint root; MPI_Comm communicator;
}

在这里插入图片描述

规约操作中可以包含很多操作

在这里插入图片描述

聚集函数:MPI_Allgather( )

MPI_Allgather(*sendbuf,sendcnt,sendtype,*recvbuf,recvcount,recvtype,comm)

将各进程的向量数据聚集为一个大向量,并分发到各个进程中,相当于各进程同步该大向量的各部分分量。
相比于MPI_Gather(),只是少了一个root参数

MPI_Allgather{void *send_data;   int send_count;   MPI_Datatype send_datatype;  void *recv_data;int recv_count;MPI_Datatype recv_datatype;MPI_Comm communicator;  
}

在这里插入图片描述

计时函数:double MPI_Wtime(void)

在这里插入图片描述

(三)summary

在这里插入图片描述在这里插入图片描述在这里插入图片描述

OTHERS:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述


http://chatgpt.dhexx.cn/article/6Qdavp2A.shtml

相关文章

C# 并行编程

一 并行任务库TPL 1 并行任务库(TPL,Task Parallel Library) 2 最重要的是Task类,还有Parallel类 3 Task类,是利用线程池来进行任务的执行 比如直接用ThreadPool更优化,而且编程更方便 4 Paallel类&…

并行处理及分布式系统

并行处理及分布式系统 1 为什么要并行计算 1.1 为什么需要不断提升性能 随着计算能力的增加,我们所面临的计算问题和需求也在增加随着技术的进步,我们从未想过的技术得到了解决,比如:人类基因解码、更准确的医疗成像、更快速准…

并行计算之MPI(一)

MPI学习 1. 了解并行计算 为什么要采用并行计算? (1)这是因为它可以加快速度即在更短的时间内解决相同的问题或在相同的时间内解决更多更复杂的问题特别是对一些新出现的巨大挑战问题; (2)节省投入并行计…

并行网关

1、并行网关 假设现在我们想在旁边放一份沙拉。无论如何,如果你想要沙拉,你可以像我们在图1.1中所做的那样建模。 图1.1:准备沙拉和主菜。 在这里,我们介绍了另一个符号:(文本)注释;这是一个您可以与任何流对象(在本…

并行计算:循环程序并行化的一般方法

一、数据划分和处理器指派 1. 带状划分方法 又叫做行列划分,就是将矩阵的整行或整列分成若干组,各组指派给一个处理器。 例如:设矩阵A由n行和m列,对其串行处理的程序段如下: for i1 to n dofor j1 to m doProcess(a[…

并行计算之MPI(三)

了解MPI 什么是MPI (1)MPI是一个库而不是一门语言,许多人认为MPI就是一种并行语言,这是不准确的。但是按照并行语言的分类可以把FORTRANMPI或CMPI。看作是一种在原来串行语言基础之上扩展后得到的并行语言,MPI库可以被…

并行计算的一些思考与总结

弗林分类法 根据弗林分类法,计算机结构主要分为 SIMD----单指令、多数据MIMD---多指令、多数据SISD----单指令、单数据MISD---多指令、单数据 一般的串行程序中为SISD,即在单核CPU下任何时间和地点只有一个指令处理一个数据,其所谓的多线程…

并行计算之MPI(二)

1.并行编程模型 目前两种最重要的并行编程模型是数据并行和消息传递数据并行编程模型的编程级别比较高编程相对简单但它仅适用于数据并行问题消息传递编程模型的编程级别相对较低但消息传递编程模型可以有更广泛的应用范围。 数据并行即将相同的操作同时作用于不同的数据因此…

Matlab 并行

Matlab 并行 1. 检查是否有并行附加功能2. 创建和删除并行2.1 创建默认的并行池2.2 在本地创建2.3 在集群创建2.4 删除 3. Parallel pool 包含的一些函数3.1 parfor3.2 parfeval 初学,肯定有理解不够的地方。看官方文件更靠谱。 1. 检查是否有并行附加功能 如果没有…

并行处理及分布式系统期末总结笔记

并行处理及分布式系统期末总结笔记 1、任务并行、数据并行的应用2、冯诺依曼体系结构的瓶颈及改进,Flynn分类法涉及的几种模型及其特点3、Cache的特点,Cache缺失、Cache命中、Cache一致性及解决方法、伪共享、流水线、多发射4、加速比、效率、阿姆达尔定…

并行程序设计导论期末复习

任务并行、数据并行的应用 任务并行 将待解决问题所需要执行的各个任务分配到各个核上执行。 数据并行 将待解决问题所需要处理的数据分配给各个核,每个核在分配到的数据集上执行大致相似的操作。 冯诺依曼体系结构的瓶颈及改进,Flynn分类法涉及的几…

并行程序设计导论 概念总结

Parallel Programing caiyi 2021/6/17 第一章 1.为什么要构建并行系统? 电路晶体管密度过大会使处理器能耗增加,散热的问题使通过继续增快集成电路密度提高处理器性能不再现实,因此集成电路商决定构建多核处理器。 2.为什么要编写并行程序&#xf…

cuda 并行计算

1 简介 2006年,NVIDIA公司发布了CUDA,CUDA是建立在NVIDIA的GPU上的一个通用并行计算平台和编程模型,基于CUDA编程可以利用GPU的并行计算引擎来更加高效地解决比较复杂的计算难题。CUDA是NVIDIA公司所开发的GPU编程模型,它提供了GP…

数据 并行

first 含义是计算机内包含一组处理单元(PE),每一个处理单元存储一个(或多个)数据元素。当机器执行顺序程序时,可对应于全部或部分的内部处理单元所存的数据同时操作。 将并行处理技术引入信息检索领域 把数…

并行的常见问题和注意事项

关于Oracle中的并行,可以说是一把双刃剑,用得好,可以充分利用系统资源,提升数据库的处理能力,用得不好,可能会适得其反。 并行的基本使用方法,对于大部分SQL开发者和DBA来说,并行的一…

并发和串行、并行的概念

先抛开语言不管,只聊概念,说起并发,就很容易想到它和串行、并行的区别。 串行:一次只能取得一个任务并执行这个任务,这个任务执行完后面的任务才能继续; 并发:指的是在同一个时间段内&#xf…

牛腩新闻发布--过程或函数 'news_selectByCaId' 需要参数 '@caid',但未提供该参数(二)

发现问题 之前有一篇博客是因为存储过程中没有添加相应的函数,导致出现了“过程或函数 ‘news_selectByCaId’ 需要参数 ‘caid’,但未提供该参数”,这次继续出现了这样一个问题,但是出现的错误就不再过程函数中了,而…

牛腩新闻发布--过程或函数 'news_selectByCaId' 需要参数 '@caid',但未提供该参数(三)

发现问题 这篇博客是建立在“牛腩新闻发布–过程或函数 ‘news_selectByCaId’ 需要参数 ‘caid’,但未提供该参数(二)”,因为在那篇博客中说出了我当时遇到的“过程或函数 ‘news_selectByCaId’ 需要参数 ‘caid’,…

【牛腩】-'T_news_selectByCaId' 需要参数 '@caid',但未提供该参数。”

问题截图 解决方案: 改动存储过程 BEGINselect n.id,n.title,n.createTime,c.[name],n.caId from T_news ninner join T_category c on n.caIdc.id and n.caIdcaidorder by n.createTime desc END检查传参是或否正确如果以上都没有错误,那就看一下是否…

【重要补充】关于第三方潜在SDK导致的5.1.2Data use sharing

接上一篇《关于IDFA、CAID和「5. 1.2 - Data use & sharing」》后,我们发现,苹果在14.5出来前,对于IDFA替代方案之数据收集的审核打击力度越来越大。 因5.1.2条款被拒,目前可以确认的原因有以下两大: 一、如果你…