MPICH笔记(三):数据类型

MPICH笔记(三):数据类型

官方文档索引:

int MPI_Type_free(MPI_Datatype *datatype)

int MPI_Type_indexed(int count, const int *array_of_blocklengths, const int *array_of_displacements, MPI_Datatype oldtype, MPI_Datatype *newtype)

int MPI_Type_create_struct(int count, const int array_of_blocklengths[], const MPI_Aint array_of_displacements[], const MPI_Datatype array_of_types[], MPI_Datatype *newtype)

int MPI_Type_commit(MPI_Datatype *datatype)

int MPI_Type_vector(int count, int blocklength, int stride,  MPI_Datatype oldtype, MPI_Datatype *newtype)

 

代码:

#include <iostream>
#include "mpi.h"

using namespace std;

int main(void) {
    MPI_Init(nullptr, nullptr);
    int rank;
    int *dat = new int[9];
    MPI_Datatype *myType = new MPI_Datatype();
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Type_vector(3, 1, 3, MPI_INT, myType);
    MPI_Type_commit(myType);
    if (rank == 1) {
        for (int i = 0; i < 9; i++) dat[i] = 0;
        MPI_Recv(dat, 1, *myType, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
        printf("Rank 1 >\n");
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                if (j) putchar(' ');
                printf("%d", dat[i * 3 + j]);
            }
            putchar('\n');
        }
    } else if (rank == 0) {
        for (int i = 0; i < 9; i++) {
            dat[i] = i + 1;
        }
        printf("Rank 0 >\n");
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                if (j) putchar(' ');
                printf("%d", dat[i * 3 + j]);
            }
            putchar('\n');
        }
        MPI_Send(dat + 1, 1, *myType, 1, 0, MPI_COMM_WORLD);
    }
    MPI_Type_free(myType);
    delete myType;
    delete [] dat;
    MPI_Finalize();
    return 0;
}

运行指令:

mpiexec -n 2 ./文件名

输出信息:

Rank 0 >
1 2 3
4 5 6
7 8 9
Rank 1 >
2 0 0
5 0 0
8 0 0

代码概述:

上面的代码只操作两个进程,进程0生成一个3 * 3的矩阵,并将其第二列发送给进程1,进程1将接收到的这一列放在其自身的第一列上。

MPI_Type_vector()

简单的用来创建新的MPI数据类型的函数,其最后一个参数MPI_Datatype *newtype是要保存新创建好的数据类型的空间的地址。它用一个四元组来描述新的数据类型,依次是新类型包含了几个旧数据类型块、新类型的每个旧数据类型块中要用几个连续的旧类型数据、旧类型数据块的大小、旧类型。

MPI_Type_commit()

用来启用新的数据类型,创建新的数据类型后,需要在使用前将新数据类型的地址传递给这个函数,这个函数会对新构造的数据类型进行分析并在使用新的数据类型进行消息通信前对非连续的数据进行通信优化\(^{[1]}\)。

MPI_Type_free()

用来清除传递给它的地址上存放的新数据类型。

 

 

参考资料:

[1]: 《并行计算的编程模型(Programming Models for Parallel Computing)》第一版,Pavan Balaji [美]、美国阿贡国家实验室编著,张云泉、李士刚、逄仁波、袁良译,机械工业出版社。