首页 > 编程知识 正文

OpenMPI一 点对点通信,网络电对点通信

时间:2023-05-04 19:21:53 阅读:265613 作者:66

为什么80%的码农都做不了架构师?>>>   

CMake

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}) 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

#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; 多参数传递 // intro/send-receive.cint 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。

// 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基本数据类型

MPIC字节数MPI_CHARchar1MPI_SHORTshort2MPI_INTint4MPI_LONGlong8MPI_UNSIGNED_CHARunsigned char1MPI_UNSIGNED_SHORTunsigned short2MPI_UNSIGNED_LONGunsigned long8MPI_UNSIGNEDunsigned int4MPI_FLOATfloat4MPI_DOUBLEdouble8MPI_LONG_DOUBLElong double16

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

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

转载于:https://my.oschina.net/VenusV/blog/2874709

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。