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。ui
標記必須是介於0和系統相關值之間的整數,系統相關值由如下程序獲取。該最大值老是≥32767。code
// 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個字節。get
只有收到指定標籤的所有消息時,接收過程纔會退出對MPI_Recv的調用。 發送過程的行爲更加複雜。 MPI_STATUS_IGNORE是一個能夠用來代替狀態變量的預約義常量。 能夠建立和傳達更復雜的數據結構。it