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);
进程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.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。
// 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是一个可以用来代替状态变量的预定义常量。 可以创建和传达更复杂的数据结构。