当前位置: 首页 > article >正文

使用MPI-IO并行读写HDF5文件

使用MPI-IO并行读写HDF5文件

HDF5支持通过MPI-IO进行并行读写,这对于大规模科学计算应用非常重要。下面我将提供C++和Fortran的示例程序,展示如何使用MPI-IO并行读写HDF5文件。

准备工作

在使用MPI-IO的HDF5之前,需要确保:

  1. HDF5库编译时启用了MPI支持
  2. 程序链接了HDF5的MPI库

C++示例

#include <hdf5.h>
#include <mpi.h>
#include <iostream>
#include <vector>#define FILE_NAME "parallel.h5"
#define DATASET_NAME "IntArray"
#define DIM0 100  // 全局维度
#define DIM1 100int main(int argc, char** argv) {// 初始化MPIMPI_Init(&argc, &argv);int mpi_rank, mpi_size;MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank);MPI_Comm_size(MPI_COMM_WORLD, &mpi_size);// 初始化HDF5的MPI环境hid_t plist_id = H5Pcreate(H5P_FILE_ACCESS);H5Pset_fapl_mpio(plist_id, MPI_COMM_WORLD, MPI_INFO_NULL);// 创建或打开文件hid_t file_id = H5Fopen(FILE_NAME, H5F_ACC_RDWR, plist_id);if (file_id < 0) {file_id = H5Fcreate(FILE_NAME, H5F_ACC_TRUNC, H5P_DEFAULT, plist_id);}H5Pclose(plist_id);// 定义数据集维度hsize_t dims[2] = {DIM0, DIM1};// 创建数据空间hid_t filespace = H5Screate_simple(2, dims, NULL);// 创建数据集hid_t dset_id = H5Dcreate(file_id, DATASET_NAME, H5T_NATIVE_INT, filespace,H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);H5Sclose(filespace);// 定义每个进程的写入区域hsize_t count[2] = {DIM0/mpi_size, DIM1};hsize_t offset[2] = {mpi_rank * count[0], 0};// 选择数据集的超平面filespace = H5Dget_space(dset_id);H5Sselect_hyperslab(filespace, H5S_SELECT_SET, offset, NULL, count, NULL);// 创建内存数据空间hid_t memspace = H5Screate_simple(2, count, NULL);// 准备数据 - 每个进程填充自己的部分std::vector<int> data(count[0] * count[1]);for (size_t i = 0; i < count[0]; ++i) {for (size_t j = 0; j < count[1]; ++j) {data[i * count[1] + j] = mpi_rank * 1000 + i * count[1] + j;}}// 设置集体写入属性plist_id = H5Pcreate(H5P_DATASET_XFER);H5Pset_dxpl_mpio(plist_id, H5FD_MPIO_COLLECTIVE);// 并行写入数据herr_t status = H5Dwrite(dset_id, H5T_NATIVE_INT, memspace, filespace,plist_id, data.data());// 清理资源H5Dclose(dset_id);H5Sclose(filespace);H5Sclose(memspace);H5Pclose(plist_id);H5Fclose(file_id);// 读取示例 - 类似写入过程if (mpi_rank == 0) {std::cout << "数据写入完成,开始读取验证..." << std::endl;}// 重新打开文件和数据集file_id = H5Fopen(FILE_NAME, H5F_ACC_RDONLY, plist_id);dset_id = H5Dopen(file_id, DATASET_NAME, H5P_DEFAULT);// 分配读取缓冲区std::vector<int> read_data(count[0] * count[1]);// 设置集体读取属性plist_id = H5Pcreate(H5P_DATASET_XFER);H5Pset_dxpl_mpio(plist_id, H5FD_MPIO_COLLECTIVE);// 选择相同的超平面filespace = H5Dget_space(dset_id);H5Sselect_hyperslab(filespace, H5S_SELECT_SET, offset, NULL, count, NULL);// 并行读取数据status = H5Dread(dset_id, H5T_NATIVE_INT, memspace, filespace,plist_id, read_data.data());// 验证数据bool error = false;for (size_t i = 0; i < count[0] * count[1]; ++i) {if (read_data[i] != data[i]) {error = true;break;}}if (!error && mpi_rank == 0) {std::cout << "数据验证成功!" << std::endl;}// 清理资源H5Dclose(dset_id);H5Sclose(filespace);H5Sclose(memspace);H5Pclose(plist_id);H5Fclose(file_id);// 结束MPIMPI_Finalize();return 0;
}

Fortran示例

program parallel_hdf5_mpiuse hdf5use mpiimplicit noneinteger :: ierr, mpi_rank, mpi_sizeinteger(hid_t) :: file_id, dset_id, filespace, memspace, plist_idinteger(hsize_t), dimension(2) :: dims = (/100, 100/)  ! 全局维度integer(hsize_t), dimension(2) :: count, offsetinteger, allocatable :: data(:, :)integer :: i, jcharacter(len=*), parameter :: file_name = "parallel.h5"character(len=*), parameter :: dset_name = "IntArray"! 初始化MPIcall MPI_Init(ierr)call MPI_Comm_rank(MPI_COMM_WORLD, mpi_rank, ierr)call MPI_Comm_size(MPI_COMM_WORLD, mpi_size, ierr)! 初始化HDF5call h5open_f(ierr)! 设置文件访问属性为MPI-IOcall h5pcreate_f(H5P_FILE_ACCESS_F, plist_id, ierr)call h5pset_fapl_mpio_f(plist_id, MPI_COMM_WORLD, MPI_INFO_NULL, ierr)! 创建或打开文件call h5fopen_f(file_name, H5F_ACC_RDWR_F, file_id, ierr, access_prp=plist_id)if (ierr /= 0) thencall h5fcreate_f(file_name, H5F_ACC_TRUNC_F, file_id, ierr, access_prp=plist_id)endifcall h5pclose_f(plist_id, ierr)! 创建数据空间call h5screate_simple_f(2, dims, filespace, ierr)! 创建数据集call h5dcreate_f(file_id, dset_name, H5T_NATIVE_INTEGER, filespace, &dset_id, ierr)call h5sclose_f(filespace, ierr)! 定义每个进程的写入区域count(1) = dims(1)/mpi_sizecount(2) = dims(2)offset(1) = mpi_rank * count(1)offset(2) = 0! 选择数据集的超平面call h5dget_space_f(dset_id, filespace, ierr)call h5sselect_hyperslab_f(filespace, H5S_SELECT_SET_F, offset, count, ierr)! 创建内存数据空间call h5screate_simple_f(2, count, memspace, ierr)! 准备数据 - 每个进程填充自己的部分allocate(data(count(1), count(2)))do i = 1, count(1)do j = 1, count(2)data(i, j) = mpi_rank * 1000 + (i-1)*count(2) + jend doend do! 设置集体写入属性call h5pcreate_f(H5P_DATASET_XFER_F, plist_id, ierr)call h5pset_dxpl_mpio_f(plist_id, H5FD_MPIO_COLLECTIVE_F, ierr)! 并行写入数据call h5dwrite_f(dset_id, H5T_NATIVE_INTEGER, data, count, ierr, &file_space_id=filespace, mem_space_id=memspace, &xfer_prp=plist_id)! 清理资源deallocate(data)call h5dclose_f(dset_id, ierr)call h5sclose_f(filespace, ierr)call h5sclose_f(memspace, ierr)call h5pclose_f(plist_id, ierr)call h5fclose_f(file_id, ierr)! 读取示例 - 类似写入过程if (mpi_rank == 0) thenprint *, "数据写入完成,开始读取验证..."endif! 重新打开文件和数据集call h5fopen_f(file_name, H5F_ACC_RDONLY_F, file_id, ierr, access_prp=plist_id)call h5dopen_f(file_id, dset_name, dset_id, ierr)! 分配读取缓冲区allocate(data(count(1), count(2)))! 设置集体读取属性call h5pcreate_f(H5P_DATASET_XFER_F, plist_id, ierr)call h5pset_dxpl_mpio_f(plist_id, H5FD_MPIO_COLLECTIVE_F, ierr)! 选择相同的超平面call h5dget_space_f(dset_id, filespace, ierr)call h5sselect_hyperslab_f(filespace, H5S_SELECT_SET_F, offset, count, ierr)! 并行读取数据call h5dread_f(dset_id, H5T_NATIVE_INTEGER, data, count, ierr, &file_space_id=filespace, mem_space_id=memspace, &xfer_prp=plist_id)! 验证数据 (这里简化为检查第一个元素)if (data(1,1) == mpi_rank * 1000 + 1 .and. mpi_rank == 0) thenprint *, "数据验证成功!"endif! 清理资源deallocate(data)call h5dclose_f(dset_id, ierr)call h5sclose_f(filespace, ierr)call h5sclose_f(memspace, ierr)call h5pclose_f(plist_id, ierr)call h5fclose_f(file_id, ierr)! 关闭HDF5call h5close_f(ierr)! 结束MPIcall MPI_Finalize(ierr)end program parallel_hdf5_mpi

编译和运行

对于C++程序:

mpicxx -o parallel_hdf5 parallel_hdf5.cpp -lhdf5 -lz
mpiexec -n 4 ./parallel_hdf5

对于Fortran程序:

mpif90 -o parallel_hdf5 parallel_hdf5.f90 -lhdf5_fortran -lhdf5 -lz
mpiexec -n 4 ./parallel_hdf5

关键点说明

  1. MPI初始化: 必须首先初始化MPI环境
  2. HDF5 MPI属性: 使用H5Pset_fapl_mpio设置文件访问属性
  3. 数据分区: 每个进程负责数据集的不同部分
  4. 超平面选择: 使用H5Sselect_hyperslab选择要读写的区域
  5. 集体操作: 使用H5Pset_dxpl_mpio设置集体I/O模式
  6. 并行一致性: 所有进程必须参与集体操作

这些示例展示了基本的并行读写操作,实际应用中可能需要更复杂的数据分区和访问模式。

相关文章:

使用MPI-IO并行读写HDF5文件

使用MPI-IO并行读写HDF5文件 HDF5支持通过MPI-IO进行并行读写&#xff0c;这对于大规模科学计算应用非常重要。下面我将提供C和Fortran的示例程序&#xff0c;展示如何使用MPI-IO并行读写HDF5文件。 准备工作 在使用MPI-IO的HDF5之前&#xff0c;需要确保: HDF5库编译时启用…...

[春秋云镜] Tsclient仿真场景

文章目录 靶标介绍&#xff1a;外网mssql弱口令SweetPotato提权上线CSCS注入在线用户进程上线 内网chisel搭建代理密码喷洒攻击映像劫持 -- 放大镜提权krbrelayup提权Dcsync 参考文章 考点: mssql弱口令SweetPotato提权CS注入在线用户进程上线共享文件CS不出网转发上线密码喷洒…...

在人工智能与计算机技术融合的框架下探索高中教育数字化教学模式的创新路径

一、引言 1.1 研究背景 在数字中国战略与《中国教育现代化 2035》的政策导向下&#xff0c;人工智能与计算机技术的深度融合正深刻地重构着教育生态。随着科技的飞速发展&#xff0c;全球范围内的高中教育都面临着培养具备数字化素养人才的紧迫需求&#xff0c;传统的教学模式…...

数据集 handpose_x_plus 3D RGB 三维手势 - 手工绘画 场景 draw picture

数据集 handpose 相关项目地址&#xff1a;https://github.com/XIAN-HHappy/handpose_x_plus 样例数据下载地址&#xff1a;数据集handpose-x-plus3DRGB三维手势-手工绘画场景drawpicture资源-CSDN文库...

deskflow使用教程:一个可以让两台电脑鼠标键盘截图剪贴板共同使用的开源项目

首先去开源网站下载&#xff1a;Release v1.21.2 deskflow/deskflow 两台电脑都要下载这个文件 下载好后直接打开找到你想要的exe desflow.exe 然后你打开他&#xff0c;将两台电脑的TLS都关掉 下面步骤两台电脑都要完成&#xff1a; 电脑点开edit-》preferences 把这个取…...

详解MYSQL表空间

目录 表空间文件 表空间文件结构 行格式 Compact 行格式 变长字段列表 NULL值列表 记录头信息 列数据 溢出页 数据页 当我们使用MYSQL存储数据时&#xff0c;数据是如何被组织起来的&#xff1f;索引又是如何组织的&#xff1f;在本文我们将会解答这些问题。 表空间文…...

Next.js/Nuxt.js 服务端渲染优化

以下是关于 Next.js/Nuxt.js 服务端渲染优化 的系统梳理,涵盖核心概念、性能优化策略、进阶技巧及工具链使用,帮助我们构建高性能的现代 Web 应用: 一、服务端渲染(SSR)核心机制 1. 基础原理对比 框架核心机制优势Next.jsgetServerSideProps 动态渲染实时数据获取,适合动…...

[Windows] 音速启动 1.0.0.0

[Windows] 音速启动 链接&#xff1a;https://pan.xunlei.com/s/VONiGZhtsxpPzze0lDIH-mR9A1?pwdxu7f# [Windows] 音速启动 1.0.0.0 音速启动是一款桌面管理软件&#xff0c;以仿真QQ界面的形式结合桌面工具的特点&#xff0c;应用于软件文件夹网址的快捷操作。...

Hyper-V 虚拟机配置静态IP并且映射到局域网使用

环境 win11hyper-v麒麟v10 配置 编辑文件 vi /etc/sysconfig/network-scripts/ifcfg-eth0文件内容 GATEWAY 需要参考网络中配置的网关地址 TYPEEthernet PROXY_METHODnone BROWSER_ONLYno BOOTPROTOstatic DEFROUTEyes IPV4_FAILURE_FATALno IPV6INITyes IPV6_AUTOCONFyes …...

操作系统基础:06 操作系统历史

我们前面已经讲过了操作系统的基本轮廓、启动过程以及系统调用等相关内容&#xff0c;就如同揭开了钢琴的盖子&#xff0c;对操作系统有了初步的表面认识。从现在起&#xff0c;我们要更深入地剖析操作系统&#xff0c;就像分解钢琴一样&#xff0c;探究其各个部分的构成、原理…...

【大模型微调】如何解决llamaFactory微调效果与vllm部署效果不一致如何解决

以下个人没整理太全 一、生成式语言模型的对话模板介绍 使用Qwen/Qwen1.5-0.5B-Chat训练 对话模板不一样。回答的内容就会不一样。 我们可以看到例如qwen模型的tokenizer_config.json文件&#xff0c;就可以看到对话模板&#xff0c;一般同系列的模型&#xff0c;模板基本都…...

【2025最新】windows本地部署LightRAG,完成neo4j知识图谱保存

之前在服务器部署neo4j失败&#xff0c;无奈只能在本地部署&#xff0c;导致后期所有使用的知识图谱数据都存在本地&#xff0c;这里为了节省时间&#xff0c;先在本地安装LigthRAG完成整个实验流程&#xff0c;后续在学习各种服务器部署和端口调用。从基础和简单的部分先做起来…...

14、nRF52xx蓝牙学习(串口 UART 和 UARTE 外设应用)

一、UART 功能描述 串口 UART 也称为通用异步收发器。是各种处理器中常用了通信接口&#xff0c;在 nRF52 芯片中&#xff0c; UART 具有以下特点&#xff1a; ● 全双工操作 ● 自动流控 ● 奇偶校验产生第 9 位数据 串口 UART 的数据发送与接收流程 : ◆硬件配置…...

FlinkSQL的常用语言

FlinkSQL 常用语言指南 FlinkSQL 是 Apache Flink 提供的 SQL 接口&#xff0c;允许用户使用标准 SQL 或扩展的 SQL 语法来处理流式和批式数据。以下是 FlinkSQL 的常用语言元素和操作&#xff1a; 基本查询 -- 选择查询 SELECT * FROM table_name;-- 带条件的查询 SELECT c…...

DeepSeek轻松入门教程——从入门到精通

大家好&#xff0c;我是吾鳴。 今天吾鳴要给大家分享一份DeepSeek小白轻松入门指导手册——《DeepSeek 15天指导手册&#xff0c;从入门到精通》。指导手册分为基础入门对话篇、效率飞跃篇、场景实战篇、高手进化篇等&#xff0c;按照指导手册操作&#xff0c;DeepSeek从入门到…...

Vue2 老项目升级 Vue3 深度解析教程

Vue2 老项目升级 Vue3 深度解析教程 摘要 Vue3 带来了诸多改进和新特性&#xff0c;如性能提升、组合式 API、更好的 TypeScript 支持等&#xff0c;将 Vue2 老项目升级到 Vue3 可以让项目获得这些优势。本文将深入解析升级过程&#xff0c;涵盖升级前的准备工作、具体升级步骤…...

vue事假机制都有哪些

Vue 的事件机制主要包含以下几种类型和方式&#xff0c;可以分为组件内部事件、父子组件通信事件、原生 DOM 事件封装、修饰符增强等&#xff0c;下面详细分类介绍&#xff1a; 一、DOM 事件绑定&#xff08;最基础的事件&#xff09; 使用 v-on&#xff08;或简写 &#xff0…...

WXJ196微机小电流接地选线装置使用简单方便无需维护

WXJ196微机小电流接地选线装置&#xff0c;能在系统发生单相接地时&#xff0c;准确、迅速地选出接地线路母 线。使用简单方便&#xff0c;无需维护&#xff0c;可根据用户需要将相关信息通过通信接口传给上级监控系统&#xff0c; 适用于无人值守变电站。 2 功能及特点 全新的…...

Java第四节:idea在debug模式夏改变变量的值

作者往期文章 Java第一节&#xff1a;debug如何调试程序&#xff08;附带源代码&#xff09;-CSDN博客 Java第二节&#xff1a;debug如何调试栈帧链&#xff08;附带源代码&#xff09;-CSDN博客 Java第三节&#xff1a;新手如何用idea创建java项目-CSDN博客 步骤一 在需要修改…...

instructor 实现 reranker 功能

目录 代码代码解释1. 导入和初始化2. Label 类定义3. RerankedResults 类4. 重排序函数 示例类似例子例子中的jinjia模板语法变量2. 控制结构条件语句循环语句 代码 import instructor from openai import OpenAI from pydantic import BaseModel, Field, field_validator, Va…...

门极驱动器DRV8353M设计(二)

目录 13.3.4.4 MOSFET VDS 感测 (SPI Only) 13.3.5 Gate Driver保护回路 13.3.5.1 VM 电源和 VDRAIN 欠压锁定 (UVLO) 13.3.5.2 VCP 电荷泵和 VGLS 稳压器欠压锁定 (GDUV) 13.3.5.3 MOSFET VDS过流保护 (VDS_OCP) 13.3.5.3.1 VDS Latched Shutdown (OCP_MODE 00b) 13.…...

学点概率论,打破认识误区

概率论是统计分析和机器学习的核心。掌握概率论对于理解和开发稳健的模型至关重要&#xff0c;因为数据科学家需要掌握概率论。本博客将带您了解概率论中的关键概念&#xff0c;从集合论的基础知识到高级贝叶斯推理&#xff0c;并提供详细的解释和实际示例。 目录 简介 基本集合…...

NVIDIA AI Aerial

NVIDIA AI Aerial 适用于无线研发的 NVIDIA AI Aerial 基础模组Aerial CUDA 加速 RANAerial Omniverse 数字孪生Aerial AI 无线电框架 用例构建商业 5G 网络加速 5G生成式 AI 和 5G 数据中心 加速 6G 研究基于云的工具 优势100% 软件定义通过部署在数字孪生中进行测试6G 标准化…...

OpenCV 关键点定位

一、Opencv关键点定位介绍 关键点定位在计算机视觉领域占据着核心地位&#xff0c;它能够精准识别图像里物体的关键特征点。OpenCV 作为功能强大的计算机视觉库&#xff0c;提供了多种实用的关键点定位方法。本文将详细阐述关键点定位的基本原理&#xff0c;深入探讨 OpenCV 中…...

C++ 重构muduo网络库

本项目参考的陈硕老师的思想 1. 基础概念 进程里有 Reactor、Acceptor、Handler 这三个对象 Reactor 对象的作用是监听和分发事件&#xff1b;Acceptor 对象的作用是获取连接&#xff1b;Handler 对象的作用是处理业务&#xff1b; 先说说 阻塞I/O&#xff0c;非阻塞I/O&…...

SDHC接口协议底层传输数据是安全的

SDHC&#xff08;Secure Digital High Capacity&#xff09;接口协议在底层数据传输过程中确实包含校验机制&#xff0c;以确保数据的完整性和可靠性。以下是关键点的详细说明&#xff1a; 物理层与数据链路层的校验机制 物理层&#xff08;Electrical Layer&#xff09;&…...

arm_math.h、arm_const_structs.h 和 arm_common_tables.h

在 ​​FOC&#xff08;Field-Oriented Control&#xff0c;磁场定向控制&#xff09;​​ 中&#xff0c;arm_math.h、arm_const_structs.h 和 arm_common_tables.h 是 CMSIS-DSP 库的核心组件&#xff0c;用于实现高效的数学运算、预定义结构和查表操作。以下是它们在 FOC 控…...

buuctf sql注入类练习

BUU SQL COURSE 1 1 实例无法访问 / Instance cant be reached at that time | BUUCTF但是这个地方很迷惑就是这个 一个 # 我们不抓包就不知道这个是sql注入类的判断是 get 类型的sql注入直接使用sqlmap我们放入到1.txt中 目的是 优先检测 ?id1>python3 sqlmap.py -r 1.t…...

具身导航中的视觉语言注意力蒸馏!Vi-LAD:实现动态环境中的社会意识机器人导航

作者&#xff1a;Mohamed Elnoor 1 ^{1} 1, Kasun Weerakoon 1 ^{1} 1, Gershom Seneviratne 1 ^{1} 1, Jing Liang 2 ^{2} 2, Vignesh Rajagopal 3 ^{3} 3, and Dinesh Manocha 1 , 2 ^{1,2} 1,2单位&#xff1a; 1 ^{1} 1马里兰大学帕克分校电气与计算机工程系&#xff0c; 2…...

全局前置守卫与购物车页面鉴权

在很多应用里&#xff0c;并非所有页面都能随意访问。例如购物车页面&#xff0c;用户需先登录才能查看。这时可以利用全局前置守卫来实现这一鉴权功能。 全局前置守卫的书写位置在 router/index.js 文件中&#xff0c;在创建 router 对象之后&#xff0c;暴露 router 对象之前…...