前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >OpenMPI(一) 点对点通信

OpenMPI(一) 点对点通信

作者头像
Pulsar-V
发布2019-03-12 16:53:56
1.3K0
发布2019-03-12 16:53:56
举报
文章被收录于专栏:Pulsar-VPulsar-V

CMake

代码语言:javascript
复制
cmake_minim_required(VERSION 3.0)
project(TEST)

find_package(MPI REQUIRED)

include_directories(${MPI_INCLUDE_PATH})

add_executable(hello hello.cpp)
target_link_libraries(hello ${MPI_LIBRARIES})
代码语言:javascript
复制
int MPI_Ssend(const void *buf, int count, MPI_Datatype datatype,
     int dest, int tag, MPI_Comm comm);
int MPI_Recv(void *buf, int count, MPI_Datatype datatype,
     int source, int tag, MPI_Comm comm, MPI_Status *status);
  • comm : 沟通器
  • tag : 信息标签
  • dest/source : 在该沟通器中的发送者和接受者的等级号
  • datatype : 所发送的数据的类型
  • count :发送和接受的数据数量
  • buf : 发送/接收的数据的开始地址

进程2发给进程3一个int型数字 :1

代码语言:javascript
复制
#include <mpi.h> 
#include <stdio.h>
int main(int argc, char** argv) {

    MPI_Init(&argc, &argv);

    int wrank; MPI_Comm_rank(MPI_COMM_WORLD, &wrank);
    int witness = 0; if (wrank==2)
    {
        int modifier = 1;
        MPI_Ssend(&modifier, 1, MPI_INT, 3, 28, MPI_COMM_WORLD);
    }
    else if (wrank==3){
	MPI_Recv(&witness, 1, MPI_INT,2,28,MPI_COMM_WORLD,MPI_STATUS_IGNORE);
	
	}
        
    printf("Rang %d, witness %d.\n", wrank, witness); 

    MPI_Finalize();
    return 0;
多参数传递
代码语言:javascript
复制
// intro/send-receive.c
int witness[] = {0, 0};  
if (wrank==2)
{
    int modifier[] = {1, 1};
    MPI_Ssend(modifier, 2, MPI_INT, 3, 28, MPI_COMM_WORLD);
}
else if (wrank==3)
    MPI_Recv(witness, 2, MPI_INT, 2, 28, MPI_COMM_WORLD, MPI_STATUS_IGNORE);

如果发送的字节数等于接收的字节数,通信将成功。例如,可以发送一个包含两个int的数组,并接收一个long或者一个double。

有关标签的详细信息

标记必须是介于0和系统相关值之间的整数,系统相关值由以下程序获取。该最大值总是≥32767。

代码语言:javascript
复制
// tag.c
#include <mpi.h> 
#include <stdio.h>

int main(int argc, char** argv) {

    MPI_Init(&argc, &argv);
    int flag;
    int* max_tag; 
   MPI_Comm_get_attr(MPI_COMM_WORLD, MPI_TAG_UB, &max_tag, &flag);
    printf("Maximum tag : %d.\n", *max_tag);
    MPI_Finalize();
    return 0; 
}

多个进程允许重复使用相同的标签:无论通信的模式如何,接收顺序与发送顺序相同。 MPI基本数据类型

MPI

C

字节数

MPI_CHAR

char

1

MPI_SHORT

short

2

MPI_INT

int

4

MPI_LONG

long

8

MPI_UNSIGNED_CHAR

unsigned char

1

MPI_UNSIGNED_SHORT

unsigned short

2

MPI_UNSIGNED_LONG

unsigned long

8

MPI_UNSIGNED

unsigned int

4

MPI_FLOAT

float

4

MPI_DOUBLE

double

8

MPI_LONG_DOUBLE

long double

16

所有MPI_ *类型的大小均为8个字节。

只有收到指定标签的全部消息时,接收过程才会退出对MPI_Recv的调用。 发送过程的行为更加复杂。 MPI_STATUS_IGNORE是一个可以用来代替状态变量的预定义常量。 可以创建和传达更复杂的数据结构。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018/11/11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 多参数传递
  • 有关标签的详细信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档