OpenMPI(一) 點對點通訊

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.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

相關文章
相關標籤/搜索