mpi中的广播
MPI可以实现一对多的集合通信,最常用的是广播:某个进程将数据广播到所有其他进程,最终的结果就是每个进程都有一份广播的数据。MPICH中的广播函数是MPI_Bcast(void* buffer,intcount,MPI_Datatype datatype,int root, MPI_Comm comm)。该函数在使用过程中非常容易出错,在此我们通过具体实例来说明其使用方法。
MPI_Bcast和MPI_Send不同
对广播最直观的观点是某个特定进程将数据一一广播到所有的进程,所以很多人在使用MPI_Bcast函数的时候,总是将其放入一个if语句中,由要发送数据的进程单独执行。但这是错误的!由某个特定进程发送数据到所有其他进行是低效的,复杂度为O(n),所以MPI_Bcast函数在实现的时候往往采用更加高效的手段进行广播。一个最常用也是非常高效的手段是规约树广播:收到广播数据的所有进程都参与到数据广播的过程中。首先只有一个进程有数据,然后它广播到某个进程,此时有两个进程有数据;然后这两个进程都参与到下一次的广播中,这时就会有4个进程有数据,……,以此类推,每次都会有2的次方个进程有数据。通过这种规约树的广播方法,广播的复杂度降为O(log
n)。当然针对不同的数据大小,MPI_Bcast函数采取了不同的广播策略。
由上面的解释,我们可以明白在广播的过程中,所有的进程都参与广播,并不只有最初的进程进行发送(它只是一个起点)。所以我们在使用MPI_Bcast函数的时候一定要将其放到所有进程都能运行的位置。
动态数组的广播
有时我们要广播的数据长度并不知道,这时就需要采用动态分配的方式分配数据,然后再将其广播。这里很容易出问题,问题的根本就是MPI程序是分布式程序,即使我们在写程序时所有的进程都公用相同的变量,但是在不同的进程下它们的含义不同。这就会导致有些进程的指针变量指向一块已经分配内存的空间,但是有些进程的指令变量还是空指针。这时如果不注意,就会导致动态数组广播的失败。
在下面的实例中,master进程从用户读取一个长度,然后利用malloc分配空间并赋值,然后将该数组广播到其他slave进程。方法是首先广播数组的长度,然后让slave进程分配相应的内存,最后再广播该数组。
#include "mpi.h"
#include <stdio.h>
#include <stdlib.h> #define MASTER 0 int main(int argc,char *argv[])
{
int myid, numprocs;
float *sequence;
int length; MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
MPI_Comm_rank(MPI_COMM_WORLD,&myid); if(myid==MASTER)
{
scanf(“%d”,&length);
sequence=(float*)malloc(sizeof(float)*length); for(int i=0;i<length;i++)
{
sequence[i]=i;
}
} /* step 1
* broadcast the length first
*/
MPI_Bcast(&length,1,MPI_INT,MASTER,MPI_COMM_WORLD); /* step 2
* allocate space on the slave processes
*/
if(myid!=MASTER)
{
sequence =(float*)malloc(sizeof(float)* length);
} /* step 3
* broadcast the sequence to all the processes
*/
MPI_Bcast(sequence, length,MPI_FLOAT,MASTER,MPI_COMM_WORLD); printf("process %d get the sequnce, length %d\n",myid, length); MPI_Finalize();
return 0;
}
通过上面三步,我们就完成了对动态数组的广播。上面的实例可以很容易扩展到结构体和其他需要动态分配内存的广播程序中。核心就是三步:1)广播长度;2)分配空间;3)广播动态数组。
上面是针对MPI广播中常见问题的解析,后续会对非基本数据类型的广播做介绍。
mpi中的广播的更多相关文章
- android中的广播接收实现总结
1 首先根据广播应用内接收和应用外接收,分两个类进行管理[1] LocalBroadcastManager,应用内广播管理类[2] BroadcastManager 广播管理类(部分应用内,应用 ...
- Android系统中的广播(Broadcast)机制简要介绍和学习计划
在Android系统中,广播(Broadcast)是在组件之间传播数据(Intent)的一种机制:这些组件甚至是可以位于不同的进程中,这样它就像Binder机制一样,起到进程间通信的作用:本文通过一个 ...
- Android中使用广播机制退出多个Activity
谷歌百度一下,Android中退出多个Activity的方法,大家讨论的很多. 在实习的时候,看到公司的项目退出多个Activity,是采用LinkedList方法,毕业设计的时候,也参照了那种方法. ...
- Android中的广播
Android中的广播 广播接受器,可以比喻成收音机.而广播则可以看成电台. Android系统内部相当于已经有一个电台 定义了好多的广播事件,比如外拨电话 短信到来 sd卡状态 电池电量变化... ...
- Apache Flink中的广播状态实用指南
感谢英文原文作者:https://data-artisans.com/blog/a-practical-guide-to-broadcast-state-in-apache-flink 不过,原文最近 ...
- Android 中的广播(Broadcast)
Android 广播(broadcast) 饮水思源 本文章内容学习和总结自 郭霖大神:<Android第一行代码> Overview 就像我们的学校里的喇叭一样,是用来通知的.而Andr ...
- Android 中的广播机制
Android 中的广播机制 Android 中的广播,按照广播响应范围,可以分为应用内广播和全局广播.按照广播的接收方式,可以分为标准广播和有序广播. 广播的分类 响应范围 应用内广播:此类广播只能 ...
- spark中的广播变量broadcast
Spark中的Broadcast处理 首先先来看一看broadcast的使用代码: val values = List[Int](1,2,3) val broadcastValues = sparkC ...
- 吴恩达深度学习:python中的广播
1.python中的广播: (1)广播是一种手段,可以让python代码执行得更快,我们来看看python实际如何执行. 下面矩阵列出了100克苹果.牛肉.鸡蛋和蛋白质中含有的碳水化合物.蛋白质和脂肪 ...
随机推荐
- POSIX 消息队列相关问题
一.查看和删除消息队列要想看到创建的posix消息队列,需要在root用户下执行以下操作:# mkdir /dev/mqueue# mount -t mqueue none /dev/mqueue删除 ...
- Android动态修改ToolBar的Menu菜单
Android动态修改ToolBar的Menu菜单 效果图 实现 实现很简单,就是一个具有3个Action的Menu,在我们滑动到不同状态的时候,把对应的Action隐藏了. 开始上货 Menu Me ...
- 安卓高级Fresco图片框架的时候
Fresco:2015FaceBook推出的 及其强大 支持webp图片格式 和渐进式图片加载 中文文档 使用方法 引入依赖 点击查看具体教程 基本使用步骤 在布局中使用其标签 <com.fac ...
- x264源代码简单分析:宏块分析(Analysis)部分-帧间宏块(Inter)
===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...
- ubuntu mysql表名大小写区分
近期开发线上操作系统用的ubuntu,数据库用的mysql,突然发现mysql表名大写报错,找一下原因,看了下mysql的配置,果真可以设置,窃喜. 先找到你MySQL的my.cnf配置文件并修改,当 ...
- Android JavascriptBridge 详解(二)
原文出自:http://blog.csdn.net/sk719887916/article/details/47189607 Android开发目前现状来说,开发者大部分时间花在UI的屏幕适配上,使用 ...
- 关于GCJ02和WGS84坐标系的一点实验
大家都知道,在兲朝的电子地图的坐标都是经过了一个坐标偏移,叫GCJ_02的东西.在网上发现了将WGS84经纬度转成GCJ02的一个代码,写了个小程序测试了下看看全国各地的偏移量有多大. 关于WGS84 ...
- 如何禁止App在后台运行以及如何保存和恢复App的状态
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 如果禁止App在后台运行 iOS上的App类似于Windows ...
- 随机采样和随机模拟:吉布斯采样Gibbs Sampling实现文档分类
http://blog.csdn.net/pipisorry/article/details/51525308 吉布斯采样的实现问题 本文主要说明如何通过吉布斯采样进行文档分类(聚类),当然更复杂的实 ...
- 剑指Offer——网易校招内推笔试题+模拟题知识点总结
剑指Offer--网易校招内推笔试题+模拟题知识点总结 前言 2016.8.2 19:00网易校招内推笔试开始进行.前天晚上利用大约1小时时间完成了测评(这个必须做,关切到你能否参与面试).上午利用2 ...