进程组的创建
  • MPI_Comm_Group
int MPI_Comm_group(
MPI_Comm comm,
MPI_Group *group
);

把相同的通信子进程放到一个组内。

#include<stdio.h>
#include<mpi.h>
#include<stdlib.h>
#include<time.h>
int main(int argc, char** argv)
{
int world_rank, world_size, rank, size;
MPI_Comm dup_comm_world,world_comm;
MPI_Group world_group;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
MPI_Comm_size(MPI_COMM_WORLD, &world_size);
MPI_Comm_dup(MPI_COMM_WORLD, &dup_comm_world);
MPI_Comm_group(dup_comm_world, &world_group);
MPI_Comm_create(dup_comm_world, world_group, &world_comm);
MPI_Comm_rank(world_comm, &rank);
if (rank != world_rank)
{
//验证复制后有无变化,如果正确的话,该代码块不会被执行。
printf("incorrect rank in world comm:%d\n", rank);
}
MPI_Finalize();
return 0;
}
  • MPI_Comm_split
int MPI_Comm_split(
MPI_Comm comm,
int color,
int key,
MPI_Comm *newcomm
);

MPI_Comm_split主要有以下四个参数:

第一个参数comm为原来的域的整体范围,也就是被划分的范围。

第二个参数为color,相同的color的节点会被划分成同一个子域。如果color被置为MPI_UNDEFINED,进程不会被纳入通信域。

第三个参数为key,在每个子域中会有诸多节点,节点在子域中的rank是多少,是通过key从小到大进行排列从而产生的。rank最小的进程会被置为0,第二小的会被置为1,以此类推。

第四个参数为newcomm,也就是一个新的通信域。

#include<stdio.h>
#include<mpi.h>
#include<stdlib.h>
#include<time.h>
int main(int argc, char** argv)
{
int row_rank,row_size,world_rank, world_size;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
MPI_Comm_size(MPI_COMM_WORLD, &world_size);
int color = world_rank / 4;
MPI_Comm row_comm;
MPI_Comm_split(MPI_COMM_WORLD, color, world_rank, &row_comm);
MPI_Comm_rank(row_comm, &row_rank);
MPI_Comm_size(row_comm, &row_size);
printf("world_rank/size:%d/%d \t row_rank/size:%d/%d\n", world_rank, world_size, row_rank, row_size);
MPI_Comm_free(&row_comm);
MPI_Finalize();
return 0;
}
  • MPI_Group_union
int MPI_Group_union(
MPI_Group group1,
MPI_Group group2,
MPI_Group *newgroup
);

求并集

  • MPI_Group_intersection
int MPI_Group_intersection(
MPI_Group group1,
MPI_Group group2,
MPI_Group *newgroup
);

交集

  • MPI_Group_difference
int MPI_Group_difference(
MPI_Group group1,
MPI_Group group2,
MPI_Group *newgroup
);
  • MPI_Group_incl
int MPI_Group_incl(
MPI_Group group,
int n,
int *ranks,
MPI_Group *newgroup
);

在一个group的基础上创建一个新的group。

  • MPI_Group_excl
int MPI_Group_excl(
MPI_Group group,
int n,
int *ranks,
MPI_Group *newgroup
);

与MPI_Group_incl相反,取不在ranks里的组成新group。

  • MPI_Group_rance_incl
int MPI_Group_range_incl(
MPI_Group group,
int n,
int ranges[][3],
MPI_Group *newgroup
);
  • MPI_Group_rance_excl
int MPI_Group_range_excl(
MPI_Group group,
int n,
int ranges[][3],
MPI_Group *newgroup
);

例子:

#include<stdio.h>
#include<mpi.h>
#include<stdlib.h>
#include<time.h>
int main(int argc, char** argv)
{
int row_rank,row_size,world_rank, world_size;
int ranks1[5] = { 0,1,2,3,4 };
int ranks2[5] = { 5,6,7,8,9 };
int result;
MPI_Group g1, g2, g3, g4;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
MPI_Comm_size(MPI_COMM_WORLD, &world_size);
MPI_Comm_group(MPI_COMM_WORLD, &g1);
MPI_Group_incl(g1, 5, ranks1, &g2);
MPI_Group_incl(g1, 5, ranks2, &g3);
MPI_Group_union(g2, g3, &g4);
MPI_Group_compare(g1, g4, &result);
printf("the result is %d for union", result);
MPI_Finalize();
return 0;
}
进程组管理
  • MPI_Group_size
int MPI_Group_size(
MPI_Group group,
int *size
);
  • MPI_Group_rank
int MPI_Group_rank(
MPI_Group group,
int *rank
);

例子:

#include<stdio.h>
#include<mpi.h>
#include<stdlib.h>
#include<time.h>
int main(int argc, char** argv)
{
int world_rank, world_size;
int re1, re2;
int r1,r2;
int ranks[5] = { 0, 1, 2, 3, 4 };
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
MPI_Comm_size(MPI_COMM_WORLD, &world_size);
MPI_Group world_group,g1,g2;
MPI_Comm_group(MPI_COMM_WORLD, &world_group);
MPI_Group_incl(world_group, 5, ranks, &g1);
MPI_Group_excl(world_group, 5, ranks, &g2);
MPI_Group_size(g1, &re1);
MPI_Group_size(g2, &re2);
MPI_Group_rank(g1, &r1);
MPI_Group_rank(g2, &r2);
printf("rank1:%d \t rank2:%d\n", r1,r2);
printf("re1:%d \t re2:%d\n", re1, re2);
MPI_Finalize();
return 0;
}
  • MPI_Group_translate_ranks
int MPI_Group_translate_ranks(
MPI_Group group1,
int n,
int *ranks1,
MPI_Group group2,
int *ranks2
);

为了防止忘记rank具体进程号

例子:

#include<stdio.h>
#include<mpi.h>
#include<stdlib.h>
#include<time.h>
int main(int argc, char** argv)
{
int world_rank, world_size;
int *ranks;
int *ranks_out;
MPI_Comm newcomm;
MPI_Group basegroup,g1;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
MPI_Comm_size(MPI_COMM_WORLD, &world_size);
MPI_Comm_group(MPI_COMM_WORLD, &basegroup);
MPI_Comm_split(MPI_COMM_WORLD, 0, world_size - world_rank, &newcomm);
MPI_Comm_group(newcomm, &g1);
ranks = (int*)malloc(world_size * sizeof(int));
ranks_out = (int*)malloc(world_size * sizeof(int));
for (int i = 0; i < world_size; i++) ranks[i] = i;
MPI_Group_translate_ranks(g1, world_size, ranks, basegroup, ranks_out);
for (int i = 0; i < world_size; i++) {
printf("Translate ranks got %d expected %d\n", ranks_out[i], (world_size - 1) - i);
}
MPI_Finalize();
return 0;
}
  • MPI_Comm_create
int MPI_Comm_create(
MPI_Comm comm,
MPI_Group group,
MPI_Comm *newcomm
);
  • MPI_Group_free
int MPI_Group_free(
MPI_Group *group
);
  • MPI_Group_compare
int MPI_Group_compare(
MPI_Group group1,
MPI_Group group2,
int *result
);

result有三种情况,如果两个组相同输出MPI_IDENT;如果只有部分元素相同,输出MPI_SIMILAR;其他输出MPI_UNEQUAL。

MPI组操作的更多相关文章

  1. Smack[3]用户列表,头像,组操作,用户操作

    用户列表 Smack主要使用Roster进行列表管理的 connection.getRoster(); /** * 返回所有组信息 <RosterGroup> * * @return Li ...

  2. js系列教程1-数组操作全解

    全栈工程师开发手册 (作者:栾鹏) 快捷链接: js系列教程1-数组操作全解 js系列教程2-对象和属性全解 js系列教程3-字符串和正则全解 js系列教程4-函数与参数全解 js系列教程5-容器和算 ...

  3. linux 用户和组操作

    linux用户操作 查看登陆用户:whoami (结果最简洁) 或者who mom likes 或者who am i查看所有用户:cat /etc/passwd 添加:sudo adduser lil ...

  4. 开发环境入门 linux基础 (部分) 复制 用户和组操作 权限更改

    复制 用户和组操作 权限更改 CP 复制命令 cp 源文件 目标文件 a) –r(recursive,递归的):递归地复制目录.当复制一个目录时,复制该目录中所有的内容,其中包括子目录的全部内容. b ...

  5. Linux操作系统常用命令合集——第二篇- 用户和组操作(15个命令)

    一.前言:本篇介绍用户和组操作的15个命令,在介绍之前我们先来看看几个示例 1.先进入到etc目录下,找到passwd文件,用vi编辑器查看: # vi /etc/passwd 解释:这里面存放着Li ...

  6. Kafka技术内幕 读书笔记之(五) 协调者——延迟的加入组操作

      协调者处理不同消费者的“加入组请求”,由于不能立即返回“加入组响应”给每个消费者,它会创建一个“延迟操作”,表示协调者会延迟发送“加入组响应”给消费者 . 但协调者不会为每个消费者的 “加入组请求 ...

  7. Java基础3-数组操作;类概述

    昨日内容回顾 数据类型 基本数据类型 1) byte, short, int, long, float, double 2) boolean[true, false] 3) char 100: 默认为 ...

  8. jmeter多用户登录跨线程组操作传值

    项目需求: 需要登录两个用户A.B,用户A操作完后会通知B,然后B再操作,B操作完结束或者再通知A. 实现思路: 1. 设置两个线程组Ⅰ.Ⅱ,组Ⅰ添加cookie管理器,里面添加用户A的操作:组Ⅱ添加 ...

  9. 009-centos6.6 用户以及组操作

    1.查看用户所属组 id admin uid=500(admin) gid=500(admin) 组=500(admin) 2.查看用户信息 用户列表文件:cat /etc/passwd 查看系统中有 ...

随机推荐

  1. Python简单的语句组

    Python简单的语句组: ''' if 条件1: 条件1满足时,需要运行的内容 ''' num = 10 if num % 6 == 4: print("num 对 6 的取模结果是 4& ...

  2. PHP readlink() 函数

    定义和用法 readlink() 函数返回符号连接的目标. 如果成功,该函数返回连接的目标.如果失败,则返回 FALSE. 语法 readlink(linkpath) 参数 描述 linkpath 必 ...

  3. PHP zip_entry_name() 函数

    定义和用法 zip_entry_name() 函数返回 zip 档案的名称.高佣联盟 www.cgewang.com 语法 zip_entry_name(zip_entry) 参数 描述 zip_en ...

  4. P5488 差分与前缀和 NTT Lucas定理 多项式

    LINK:差分与前缀和 这道题和loj的一个人的高三楼相似. 也略有不同 先考虑前缀和:设G(x)为原式的普通型生成函数 \(F(x)=1+x+x^2+...\) 那么其实求的是 \(G(x)*(F( ...

  5. luogu P6088 [JSOI2015]字符串树 可持久化trie 线段树合并 树链剖分 trie树

    LINK:字符串树 先说比较简单的正解.由于我没有从最简单的考虑答案的角度思考 所以... 下次还需要把所有角度都考察到. 求x~y的答案 考虑 求x~根+y~根-2*lca~根的答案. 那么问题变成 ...

  6. 【NOIP2016】换教室 题解(期望DP)

    前言:状态贼鸡儿多,眼睛快瞎了. ----------------------- 题目链接 题目大意:给定$n(课程数),m(可换次数),v(教室数),e(无向边数)$,同时给定原定教室$c[i]$和 ...

  7. 【FZYZOJ】数论课堂 题解(约数个数定理)

    前言:想了两个小时orz,最后才想到要用约数个数定理…… ------------- 题目大意: 给定$n,q,A[1],A[2],A[3]$ 现有$A[i]=(A[i-1]+A[i-2]+A[i-3 ...

  8. C++ Json工具--Jsoncpp用法简介

    文章目录 Json简介 用法简介 数据类型 C++代码示例 代码执行输出结果 JSON在线解析及格式化验证 - JSON.cn Json简介 JSON(JavaScript Object Notati ...

  9. 035_go语言中的速率限制

    代码演示 package main import "fmt" import "time" func main() { requests := make(chan ...

  10. JS解密入门——有道翻译

    JS解密入门——有道翻译 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知道如何去学习更加高深的知识.那么针对这 ...