MPI内置类型与自定义类型

这篇具有很好参考价值的文章主要介绍了MPI内置类型与自定义类型。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

内置类型

MPI_CHAR: 字符型

  • MPI_UNSIGNED_CHAR: 无符号字符型
  • MPI_BYTE: 字节型
  • MPI_SHORT: 短整型
  • MPI_UNSIGNED_SHORT: 无符号短整型
  • MPI_INT: 整型
  • MPI_UNSIGNED: 无符号整型
  • MPI_LONG: 长整型
  • MPI_UNSIGNED_LONG: 无符号长整型
  • MPI_FLOAT: 单精度浮点型
  • MPI_DOUBLE: 双精度浮点型
  • MPI_LONG_DOUBLE: 长双精度浮点型

自定义类型

MPI_Type_contiguous: 创建一个由相同大小的元素组成的类型

函数原型

int MPI_Type_contiguous(int count, MPI_Datatype oldtype, 
MPI_Datatype *newtype)

参数详解

  • count:新类型中元素的数量。
  • oldtype:待复制元素的类型。
  • newtype:返回一个新类型。

MPI_Type_vector: 创建一个由相同大小、位于相隔固定间距的元素组成的类型

函数原型

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

参数详解

  • count:向量中连续元素的数量。
  • blocklength:向量中相邻元素之间的间距。
  • stride:元素之间的间距(读取到该元素后,要跳过多少个元素才能读取下一个元素)。
  • oldtype:待复制元素的类型。
  • newtype:返回一个新类型。

MPI_Type_create_struct: 创建一个由不同类型的元素组成的类型

函数原型

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)

参数详解

  • count:新类型中元素的数量。
  • array_of_blocklengths:指定每个元素的长度。
  • array_of_displacements:指定每个元素的偏移量。需要注意的是,对于数组类型,偏移量必须是 MPI_Aint 类型。
  • array_of_types:指定每个元素的类型。
  • newtype:返回一个新类型。

代码实例

#include <stdio.h>
#include <mpi.h>

typedef struct {
  int x, y;
} Vector2D;

int main(int argc, char** argv) {
  int size, rank;
  MPI_Init(&argc, &argv);
  MPI_Comm_size(MPI_COMM_WORLD, &size);
  MPI_Comm_rank(MPI_COMM_WORLD, &rank);

  MPI_Datatype Vector2D_type;
  MPI_Type_vector(1, 2, 3, MPI_INT, &Vector2D_type);
  const MPI_Aint displacements[] = {0, offsetof(Vector2D, y)};
  const int blocklengths[] = {1, 1};
  MPI_Datatype types[] = {MPI_INT, MPI_INT};
  MPI_Type_create_struct(2, blocklengths, displacements, types, &Vector2D_type);
  MPI_Type_commit(&Vector2D_type);

  if (rank == 0) {
    Vector2D v = {1, 2};
    MPI_Send(&v, 1, Vector2D_type, 1, 0, MPI_COMM_WORLD);
    printf("Process 0 sent vector [%d, %d] to process 1\n", v.x, v.y);
  } else if (rank == 1) {
    Vector2D v_recv;
    MPI_Recv(&v_recv, 1, Vector2D_type, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
    printf("Process 1 received vector [%d, %d] from process 0\n", v_recv.x, v_recv.y);
  }

  MPI_Type_free(&Vector2D_type);
  MPI_Finalize();

  return 0;
}

MPI_Type_indexed函数创建一个由相同大小的元素组成的类型,但这些元素并不连续,而是位于一个数组的不同位置

函数原型

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

参数详解

  • count:新类型中元素的数量。
  • array_of_blocklengths:一个整数数组,指定每个块中连续元素的数量。
  • array_of_displacements:一个整数数组,指定每个块的起始位置。
  • oldtype:待复制元素的类型。
  • newtype:返回一个新类型。

代码实例

#include <stdio.h>
#include <mpi.h>

int main(int argc, char** argv) {
  int size, rank;
  MPI_Init(&argc, &argv);
  MPI_Comm_size(MPI_COMM_WORLD, &size);
  MPI_Comm_rank(MPI_COMM_WORLD, &rank);

  int block_lengths[3] = {2, 3, 2};
  int displacements[3] = {0, 4, 12};
  int data[7] = {1, 2, 3, 4, 5, 6, 7};
  MPI_Datatype Complex_type;
  MPI_Type_indexed(3, block_lengths, displacements, MPI_INT, &Complex_type);
  MPI_Type_commit(&Complex_type);

  if (rank == 0) {
    printf("Sending complex data...\n");
    MPI_Send(data, 1, Complex_type, 1, 0, MPI_COMM_WORLD);
  } else if (rank == 1) {
    int recv_data[7];
    MPI_Recv(recv_data, 7, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
    printf("Received complex data: [");
    for (int i = 0; i < 7; i++) {
      printf("%d ", recv_data[i]);
    }
    printf("]\n");
  }

  MPI_Type_free(&Complex_type);
  MPI_Finalize();
  
  return 0;
}

MPI_Type_hvector 创建一个向量数据类型,但与 MPI_Type_vector 不同的是,所有的数据元素不需要具有相同的大小和类型。具体来说,MPI_Type_hvector 允许用户按照任意的字节长距离来描述向量的结构

函数原型

int MPI_Type_hvector(int count, int blocklength, 
MPI_Aint stride, MPI_Datatype oldtype, MPI_Datatype *newtype)

参数详解

  • count:向量中元素的数量。
  • blocklength:向量中每个元素的个数。
  • stride:相邻元素之间的偏移(以字节为单位)。
  • oldtype:要重复的原始数据类型。
  • newtype:输出的新数据类型。

代码实例
假设有一个数组 a,它的每个元素的大小是 4 字节,我们想要创建一个新的 MPI 类型,每 2 个元素组合在一起,组成一个长度为 8 字节的结构体。在这种情况下,我们可以使用 MPI_Type_hvector 来创建新的数据类型:文章来源地址https://www.toymoban.com/news/detail-692589.html

MPI_Datatype struct_type, temp_type;
MPI_Type_contiguous(2, MPI_INT, &temp_type);
MPI_Type_create_resized(temp_type, 0, 8, &struct_type);
MPI_Type_commit(&struct_type);
MPI_Type_free(&temp_type);

MPI_Datatype vector_type;
MPI_Type_hvector(4, 1, 8, struct_type, &vector_type);
MPI_Type_commit(&vector_type);

到了这里,关于MPI内置类型与自定义类型的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Vue2-收集表单数据、过滤器、内置指令与自定义指令、Vue生命周期

    🥔:我徒越万重山 千帆过 万木自逢春 更多Vue知识请点击——Vue.js 1、不同标签的value属性 若: input type=\\\"text\\\"/ 普通输入框,则v-model收集的是value值,用户输入的就是value值。 若: input type=\\\"radio\\\"/ 单选框,则v-model收集的是value值,且要给标签配置value值。 若: input type=\\\"checkb

    2024年02月13日
    浏览(35)
  • 7、hive shell客户端与属性配置、内置运算符、函数(内置运算符与自定义UDF运算符)

    1、apache-hive-3.1.2简介及部署(三种部署方式-内嵌模式、本地模式和远程模式)及验证详解 2、hive相关概念详解–架构、读写文件机制、数据存储 3、hive的使用示例详解-建表、数据类型详解、内部外部表、分区表、分桶表 4、hive的使用示例详解-事务表、视图、物化视图、DDL

    2024年02月09日
    浏览(35)
  • python实现科学计算与自定义手绘风

    目标: 1.运用科学计算库进行矩阵分析和数值运算; 2.掌握numpy库的使用。 要点:这是一个使用 numpy 和 PIL 库提取图像特征形成手绘效果的实例。 使用PIL库获取了图像的轮廓,虽然提取了轮廓,但这个轮廓缺少立体感,视觉效果不够丰满。 光线照射使立体物出现明暗变化,运

    2024年02月06日
    浏览(25)
  • 矩阵乘法的MPI并行实验报告

    (1) 分别用 1,2,4,8 个进程完成矩阵乘法(同一个程序):A * B = C,其中 A,B,C 均为 2048*2048 双精度点方阵,0号进程负责初始化矩阵 A,B 并将结果存入 0 号进程。 (2) 绘制加速比曲线; 操作系统:Windows11 编程语言:C++(使用MPI接口) 编译器:VC++ 核心库:MPI(MSMPI)

    2024年02月08日
    浏览(35)
  • 使用mpi并行技术实现快排Qsort()

    快排基本原理: 快速排序可以说是最为常见的排序算法,冒泡排序时间复杂度达到了O(N2),而桶排序容易造成浪费空间。快排(Quicksort)就成为了不错的选择。 1、原理:快排需要找一个数作为基准数,用来参照。(可取第一个数为参照)         基准数在中间某位置,

    2024年02月10日
    浏览(31)
  • CUDA 以及MPI并行矩阵乘连接服务器运算vscode配置

    本地安装 服务器端安装 c_cpp_properties.json launch.json tasks.json     本地安装和服务器端安装的扩展和CUDA一样 c_cpp_properties.json launch.json settings.json tasks.json

    2024年04月27日
    浏览(30)
  • Vue:插槽,与自定义事件

                 

    2024年02月11日
    浏览(29)
  • tomcat与自定义类加载器

    类加载器除了用于加载类外,还可用于确定类在Java虚拟机中的唯一性。 不同类加载器加载的类在 JVM 看来是两个不同的类,因为在 JVM 中一个类的唯一标识是 类加载器+类名(包括包名)。 启动类加载器,Bootstrap ClassLoader,加载JAVA_HOMElib,或者被-Xbootclasspath参数限定的类 扩展类

    2024年02月11日
    浏览(29)
  • Winform自定义控件与自定义属性的简单使用

    Winform自定义控件和属性的学习  最近新文章:C#Winform批量获取CSV内容展示,并保存 目录 一、自定义控件的使用 1.在Winform程序中添加新建项,选择Windows窗体用户控件 2.拖拽使用自定义控件到主窗体中 注意点① : 二、自定义控件的自定义属性 1.在自定义控件中添加一个控件

    2023年04月15日
    浏览(30)
  • “深入理解网络科学与自定义网络构建“

    1.1 什么是网络? 在计算机科学中,网络是一种将多个设备连接在一起,实现信息共享和通信的技术。网络的发展可以追溯到20世纪,最早用于军事通信。随着互联网的普及,网络变得无处不在。现代网络分层模型包括OSI模型和TCP/IP模型,每一层都有特定的功能和责任。 子网

    2024年01月19日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包