MPI 派生数据类型 | 丁香推荐网

MPI 派生数据类型

编程杂谈 funy 1年前 (2019-08-16) 410次浏览 已收录 0个评论 扫描二维码

说明

自己构造数据类型,利用MPI广播函数一次性完成数据的传输,传输的数据为 int a; char c[10]; double b; double B[12];

下面是代码

/*================================================================
*   Copyright (C) 2019 * Ltd. All rights reserved.
*
*   File name   : mpi_create_struct.c
*   Author      : longbin
*   Created date: 2019-03-27 23:07:13
*   Description :
*
*===============================================================*/


#include 
#include 

void Build_Mpi_Type(int* a,char *c,double *b,double *B, MPI_Datatype* my_data);
int main()
{
    //这些数据可以从键盘获取,为了方便直接设定好了
    int a=10;
    char c[10]={'a','b','c','d','e','f','g','h','i','j'};
    double b=12.0;
    double B[12]={1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0,11.0,12.0};
    int size, rank;

    MPI_Init(NULL,NULL);//初始化
    MPI_Comm_size(MPI_COMM_WORLD, &size); //获取总的进程数量
    MPI_Comm_rank(MPI_COMM_WORLD, &rank); //获取当前进程号
    MPI_Datatype my_data;  //声明数据类型
    //建立派生数据类型
    Build_Mpi_Type(&a, c, &b, B, &my_data );
    //广播消息
    MPI_Bcast(&a, 1, my_data, 0, MPI_COMM_WORLD);
    //释放派生数据类型
    MPI_Type_free(&my_data);

    //如果进程号不是0,就打印自己获取的东西
    if(rank != 0)
    {
        printf("My rank is %d of %d, and the a is %d, the b is %lf\n",rank,size,a,b);
        printf("My rank is %d of %d, and the c is %s",rank, size, c);
    }

    MPI_Finalize();//结束
    return 0;
}

void Build_Mpi_Type(int* a,char *c,double *b,double *B, MPI_Datatype* my_data)
{
    //每个元素起始地址
    MPI_Aint a_add, c_add, b_add, B_add;
    //为mpi_create_struct函数准备参数
    int count = 4;
    int array_of_blocklengths[4] = {1,10,1,12}; //每种数据类型的长度
    MPI_Aint array_of_displacements[4] = {0}; //每种数据类型的起始地址
    MPI_Datatype array_of_types[4] = {MPI_INT,MPI_CHAR,MPI_DOUBLE,MPI_DOUBLE}; //类型

    //获取地址
    MPI_Get_address(a, &a_add);
    MPI_Get_address(c, &c_add);
    MPI_Get_address(b, &b_add);
    MPI_Get_address(B, &B_add);
    //获取偏移量
    array_of_displacements[1] = c_add - a_add;
    array_of_displacements[2] = b_add - a_add;
    array_of_displacements[3] = B_add - a_add;

    //创建派生数据类型
    MPI_Type_create_struct(count, array_of_blocklengths, array_of_displacements, array_of_types, my_data);
    MPI_Type_commit(my_data); //告知编译器创建的数据类型
}

转载请注明出处!


本站交流 Telegram群组Telegram频道 QQ群
丁香推荐网, 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:MPI 派生数据类型
喜欢 (0)
关于作者:
分享互联网资源,VPS测评,VPS推荐,VPS优惠通知!

您必须 登录 才能发表评论!