使用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. 并行一致性: 所有進程必須參與集體操作

這些示例展示了基本的并行讀寫操作,實際應用中可能需要更復雜的數據分區和訪問模式。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/79046.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/79046.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/79046.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

七、自動化概念篇

自動化測試概念 自動化測試是把以人為驅動的測試行為轉化為機器執行的一種過程。通常&#xff0c;在設計了測試用例并通過評審之后&#xff0c;由測試人員根據測試用例中描述的過程一步步執行測試&#xff0c;得到實際結果與期望結果的比較。在此過程中&#xff0c;為了節省人…

redis cluster 的通信機制

Redis Cluster 的通信機制是其分布式架構的核心&#xff0c;基于 Gossip 協議 和 Cluster Bus 實現節點間狀態同步與數據協調。以下是其通信機制的核心要點&#xff1a; 二進制協議&#xff1a;數據以字節流形式編碼&#xff08;如Protobuf、Thrift、MQTT、Gossip&#xff09;。…

CTF web入門之文件上傳

知識點 產生文件上傳漏洞的原因 原因: 對于上傳文件的后綴名(擴展名)沒有做較為嚴格的限制 對于上傳文件的MIMETYPE(用于描述文件的類型的一種表述方法) 沒有做檢查 權限上沒有對于上傳的文件目錄設置不可執行權限,(尤其是對于shebang類型的文件) 對于web server對于上傳…

PhotoShop學習09

1.彎曲鋼筆工具 PhotoShop提供了彎曲鋼筆工具可以直觀地創建路徑&#xff0c;只需要對分段推拉就能夠進行修改。彎曲港幣工具位于工具面板中的鋼筆工具里&#xff0c;它的快捷鍵為P。 在使用前&#xff0c;可以把填充和描邊選為空顏色&#xff0c;并打開路徑選項&#xff0c;勾…

tsconfig.json配置不生效

說明一下我遇到的問題&#xff0c;這是我的配置文件代碼的 {"compilerOptions": {"module": "none","target": "ES5","outFile": "./dist/bundle.js"} } 和我想象不同的是&#xff0c;我編譯成 js 沒…

源代碼加密之零日攻擊

# SDC沙盒&#xff1a;有效防御零日攻擊的多層防護體系 在當今復雜多變的網絡安全環境中&#xff0c;零日攻擊已成為企業面臨的重大威脅之一。零日攻擊利用尚未被公眾發現或尚未被軟件供應商修復的漏洞進行攻擊&#xff0c;具有極高的隱蔽性和破壞性。SDC沙盒作為一種先進的數…

記錄一次TDSQL網關夯住故障

環境信息&#xff1a; TDSQL-MySQL同城雙中心集群&#xff0c;集中式實例&#xff0c;一主三副本&#xff0c;每個中心兩個db副本&#xff0c;每個中心一個VIP&#xff0c;V每個IP通過硬件做負載均衡指向該中心兩個proxy&#xff0c;操作系統為麒麟v10 arm。 故障描述&#xf…

代碼隨想錄八股訓練營完結總結

&#xff01; 40天的訓練營&#xff0c;我總結了自己完整的八股文&#xff0c;后續在面試過程中可以補充 很感謝這次訓練營&#xff0c;真的高頻&#xff0c;在面試中能擊中60%以上&#xff0c;剩下的就靠平時的積累了。 感謝訓練營的小伙伴&#xff0c;很多次想偷懶&#x…

VS Code 的 .S 匯編文件里面的注釋不顯示綠色

1. 確認文件語言模式 打開 .S 文件后&#xff0c;查看 VS Code 右下角的狀態欄&#xff0c;確認當前文件的識別模式&#xff08;如 Assembly、Plain Text 等&#xff09;。如果顯示為 Plain Text 或其他非匯編模式&#xff1a; 點擊狀態欄中的語言模式&#xff08;如 Plain Te…

iphone各個機型尺寸

以下是蘋果&#xff08;Apple&#xff09;歷代 iPhone 機型 的屏幕尺寸、分辨率及其他關鍵參數匯總&#xff08;截至 2023年10月&#xff0c;數據基于官方發布信息&#xff09;&#xff1a; 一、標準屏 iPhone&#xff08;非Pro系列&#xff09; 機型屏幕尺寸&#xff08;英寸…

VSCode寫java時常用的快捷鍵

首先得先安好java插件 1、獲取返回值 這里是和idea一樣的快捷鍵的&#xff0c;都是xxxx.var 比如現在我new一個對象 就輸入 new MbDo().var // 點擊回車即可變成下面的// MbDo mbDo new MbDo()//以此類推get方法也可獲取 mbDo.getMc().var // 點擊回車即可變成下面的 // St…

相機內外參

文章目錄 相機內參相機外參 相機的內外參是相機標定過程中確定的重要參數&#xff0c;用于建立圖像像素坐標與實際世界坐標之間的關系。 相機內參 定義&#xff1a;相機內參是描述相機內部光學和幾何特性的參數&#xff0c;主要包括焦距、主點坐標、像素尺度因子以及畸變系數等…

【視頻目標分割論文集】Efficient Track Anything0000

github 摘要 視頻對象分割和追蹤任意目標領域出現了強大的工具——分割任意模型 2&#xff08;SAM 2&#xff09;。SAM 2 實現令人印象深刻的視頻對象分割性能的關鍵組成部分包括用于幀特征提取的大型多階段圖像編碼器&#xff0c;以及存儲過去幀記憶上下文以輔助當前幀分割的…

CSS學習02 動態列數表格開發,解決多組數據布局與邊框重合問題

概要 在前端開發中&#xff0c;表格常用于展示結構化數據。當數據組的字段數量不統一時&#xff08;如有的行包含 3 組數據&#xff0c;有的行包含 2 組或 1 組&#xff09;&#xff0c;傳統固定列數的表格會出現結構錯位、邊框重合等問題。本文通過 HTML/CSS 規范方法&#x…

Spark-core編程總結

1.reduce? 功能?&#xff1a;聚集RDD中的所有元素&#xff0c;先聚合分區內數據&#xff0c;再聚合分區間數據。 示例?&#xff1a;rdd.reduce(__) 將RDD中的所有整數相加。 2.collect? 功能?&#xff1a;在驅動程序中&#xff0c;以數組Array的形式返回數據集的所有元…

處理Long類型長度超長導致前端精度丟失問題

1&#xff0c;問題場景 后端返回的Long類型的數據&#xff0c;超10000000000000000&#xff0c;前端處理的時候&#xff0c;數據被截斷了。比如tchId: 11073477511443988481&#xff0c; 前端根據tchId獲取下一環節信息的時候&#xff0c;傳的tchId變成了11073477511443988400&…

ONVIF/RTSP/RTMP協議EasyCVR視頻匯聚平臺RTMP協議配置全攻略 | 直播推流實戰教程

在現代化的視頻管理和應急指揮系統中&#xff0c;RTMP協議作為一種高效的視頻流傳輸方式&#xff0c;正變得越來越重要。無論是安防監控、應急指揮&#xff0c;還是物聯網視頻融合&#xff0c;掌握RTMP協議的接入和配置方法&#xff0c;都是提升系統性能和效率的關鍵一步。 今天…

安徽京準:GPS北斗衛星時空信號安全防護裝置(授時)介紹

安徽京準&#xff1a;GPS北斗衛星時空信號安全防護裝置&#xff08;授時&#xff09;介紹 1、主要特點 ★信號加固功能&#xff1a; GPS/BDS單系統信號拒止情況下&#xff08;包含受到GPS L1欺騙干擾、GPS L1壓制干擾、BDS B1欺騙干擾、BDS B1壓制干擾&#xff09;&#xff…

探索原生JS的力量:自定義實現類似于React的useState功能

1.寫在前面 本方案特別適合希望在歷史遺留的原生JavaScript項目中實現簡單輕量級數據驅動機制的開發者。無需引入任何框架或第三方庫&#xff0c;即可按照此方法封裝出類似于React中useState的功能&#xff0c;輕松為項目添加狀態管理能力&#xff0c;既保持了項目的輕量性&am…

02.使用cline(VSCode插件)、continue(IDEA插件)、cherry-studio玩轉MCP

文章目錄 安裝環境uv&#xff08;python&#xff09;為什么不用pip&#xff1f;安裝 nvm&#xff08;nodejs&#xff09; cline插件window配置如下linux配置如下測試MCP&#xff1a;time現在幾點了&#xff1f;倫敦現在幾點了&#xff1f;當紐約是下午四點&#xff0c;那倫敦是…