【并行计算】【《并行程序设计导论》笔记】第三章:用MPI进行分布式内存编程

ops/2024/10/21 3:52:19/

文章目录

      • 3.1|预备知识
        • 编译与执行
          • 打印来自进程问候语句的MPI程序
          • 编译
          • 执行
        • 通信子
        • SPMD程序
        • MPI_Send()方法
        • status_p参数
        • MPI_Send()和MPI_Recv()的语义
        • 潜在的陷阱

因上努力

个人主页:丷从心·

系列专栏:并行计算

果上随缘


3.1|预备知识

编译与执行
打印来自进程问候语句的MPI程序
#include <stdio.h>
#include <string.h>
#include <mpi.h>const int MAX_STRING = 100;int main(void)
{char greeting[MAX_STRING];int comm_sz;int my_rank;MPI_Init(NULL, NULL);MPI_Comm_size(MPI_COMM_WORLD, &comm_sz);MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);if (my_rank != 0){sprintf(greeting, "Greetings from process %d of %d!", my_rank, comm_sz);MPI_Send(greeting, strlen(greeting) + 1, MPI_CHAR, 0, 0, MPI_COMM_WORLD);}else{printf("Greetings from process %d of %d!\n", my_rank, comm_sz);for (int q = 1; q < comm_sz; q++){MPI_Recv(greeting, MAX_STRING, MPI_CHAR, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, MPI_STATUS_IGNORE);printf("%s\n", greeting);}}MPI_Finalize();return 0;
}
编译
mpicc -g -Wall -o mpi_hello mpi_hello.c
执行
mpiexec -n 4 ./mpi_hello
通信子
  • 通信子指的是一组可以互相发送消息的进程集合
  • 通信子称为MPI_COMM_WORLD
SPMD程序
  • S P M D SPMD SPMD是指单程序多数据流
  • 一个单一程序,让不同进程产生不同动作,让进程按照它们的进程号来匹配程序分支
MPI_Send()方法
  • 参数tag是个非负int型,用于区分看上去完全一样的消息,例如tag 0 0 0表示消息用于打印,tag 1 1 1表示消息用于计算
  • 一个通信子中的进程所发送的消息不能被另一个通信子中的进程所接收
status_p参数
  • MPI_Status是一个有至少三个成员MPI_SOURCEMPI_TAGMPI_ERROR的结构
  • 接收到的数据量不是存储在应用程序可以直接访问到的域中,可以通过调用MPI_Get_count函数找回这个值
int MPI_Get_count(MPI_Status* status_p, MPI_Datatype type, int* count_p)
MPI_Send()和MPI_Recv()的语义
  • MPI_Send()典型的实现方法有一个默认的消息截止大小,如果一条消息的大小小于截止大小,它将被缓冲;如果大于截止大小,那么MPI_Send()函数将被阻塞
  • M P I MPI MPI要求消息是不可超越的,即如果 q q q号进程发送了两条消息给 r r r号进程,那么 q q q进程发送的第一条消息必须在第二条消息之前可用
潜在的陷阱
  • 如果一个进程试图接收消息,但没有相匹配的消息,那么该进程将会被永远阻塞在那里,即进程悬挂
  • 如果调用MPI_Send()发生了阻塞,并且没有相匹配的接收,那么发送进程就悬挂;如果调用MPI_Send()被缓冲,但没有相匹配的接收,那么消息将被丢失


http://www.ppmy.cn/ops/28740.html

相关文章

【Mac】Mac安装软件常见问题解决办法

前言 刚开始用Mac系统的小伙伴或者在更新系统版本后运行App的朋友会经常碰到弹窗提示「xxx已损坏&#xff0c;无法打开&#xff0c;您应该将它移到废纸篓」、「打不开xxx&#xff0c;因为Apple无法检查其是否包含恶意软件」、「打不开xxx&#xff0c;因为它来自身份不明的开发…

Elasticsearch 索引 blocks:深入探讨数据保护

Elasticsearch 作为搜索和分析数据的首选分布式引擎在技术领域脱颖而出&#xff0c;尤其是在处理日志、事件和综合文本搜索时。 它的与众不同之处在于它如何让你使用各种块选项调整对其索引的访问。 这对于那些负责技术项目的人&#xff08;比如管理员和编码员&#xff09;来说…

特别的时钟特别的倒计时

念念不忘的歌曲&#xff1a;Thats Why You Go Away <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title&…

数据结构的队列(c语言版)

一.队列的概念 1.队列的定义 队列是一种常见的数据结构&#xff0c;它遵循先进先出的原则。类似于现实生活中排队的场景&#xff0c;最先进入队列的元素首先被处理&#xff0c;而最后进入队列的元素则要等到前面的元素都被处理完后才能被处理。 在队列中&#xff0c;元素只能…

中间件解析漏洞

1 、 apache 解析漏洞 漏洞环境搭建 下载 vulhub git clone https://github.com/vulhub/vulhub.git 进入对应漏洞目录、 cd vulhub/httpd/apache_parsing_vulnerability apt-get docker-compose 启动漏洞环境 docker-compose up -d 注&#xff1a;启动容器时&#xf…

微信小程序与web-view网页进行通信的尝试

首先&#xff0c;微信小程序向web-view传递数据一般通过地址栏传参的形式&#xff08;给src赋值或者修改hash&#xff09;&#xff0c;这样一般就已经能够满足实际开发需求了&#xff0c;所以这里主要探讨web-view向微信小程序传参。下面&#xff0c;我们从官方文档入手&#x…

2024年第二十六届“华东杯”(B题)大学生数学建模挑战赛|数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时&#xff0c;你是否曾经感到茫然无措&#xff1f;作为2022年美国大学生数学建模比赛的O奖得主&#xff0c;我为大家提供了一套优秀的解题思路&#xff0c;让你轻松应对各种难题。 让我们来看看华东杯 (B题&#xff09;&#xff01; 第一个问题…

LabVIEW高效目标跟踪系统

LabVIEW高效目标跟踪系统 随着机器视觉技术的飞速发展&#xff0c;设计和实现高效的目标跟踪系统成为了众多领域关注的焦点。基于LabVIEW平台&#xff0c;结合NI Vision机器视觉库&#xff0c;开发了一种既高效又灵活的目标跟踪系统。通过面向对象编程方法和队列消息处理器程序…