Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用OpenMPI创建HDF5文件和数据集

使用OpenMPI创建HDF5文件和数据集
EN

Stack Overflow用户
提问于 2015-03-16 11:22:23
回答 2查看 463关注 0票数 0

我需要将我的HDF5数据集并行地写到一个HDF5文件中,并且我想只用一个线程来创建我的文件,为此,我可以使用if语句,例如:

代码语言:javascript
运行
AI代码解释
复制
if( currentThread == 0)
{
    createHDF5File( );
}

但我不知道哪个线程会先出现。例如,当线程1首先出现时,它会尝试将数据集写入不存在的文件。有没有办法选择第一个线程?或者有没有更好的方法来做到这一点?

EN

回答 2

Stack Overflow用户

发布于 2015-03-17 16:43:14

听起来你真的应该在HDF5中使用并行IO。HDF5能够使用MPI-IO (在幕后),如果您使用并行支持构建它的话。

下面是一个示例程序(用Fortran编写)。

代码语言:javascript
运行
AI代码解释
复制
! Program to use MPI_Cart and Parallel HDF5
!
program hdf_pwrite

        use, intrinsic :: iso_c_binding, only: c_double
        use mpi
        use hdf5
        use kinds, only : r_dp

        implicit none

        ! external interface
        interface
                subroutine get_walltime(t) &
                                bind(c, name="get_walltime")
                                import :: c_double
                                real(kind=c_double), intent(out) :: t
                end subroutine get_walltime
        end interface

        ! Local 4000x4000 with a 1x1 halo
        integer, parameter :: ndims = 2
        integer, parameter :: N     = 4000
        integer, parameter :: halo  = 1

        integer :: argc                        ! Command line args
        integer :: ierr                        ! Error status
        integer :: id                          ! My rank/ID
        integer :: np                          ! Number of processors
        integer :: iunit                       ! File descriptor
        integer :: i,j                         ! Loop indexers
        integer :: total                       ! Total dimension size
        integer :: lcount                      ! Luster count size
        integer :: lsize                       ! Lustre stripe size
        character(len=1024) :: clcount, clsize ! Strings of LFS
        integer :: info                        ! MPI IO Info
        integer :: m_dims(ndims)               ! MPI cart dims
        integer :: coords(ndims)               ! Co-ords of procs in the grid
        logical :: is_periodic(ndims)          ! Periodic boundary conditions
        logical :: reorder                     ! Reorder the MPI structure
        integer :: MPI_COMM_2D                 ! New communicator

        integer(KIND=MPI_OFFSET_KIND) :: offset

        character(len=1024) :: filename
        integer(kind=hid_t) :: p_id, f_id, x_id, d_id
        integer(kind=hid_t) :: memspace, filespace
        ! Local hyper slab info
        integer(kind=hsize_t) :: d_size(ndims), s_size(ndims), h_size(ndims),&
                                 stride(ndims), block(ndims)
        ! Global hyper slab info
        integer(kind=hsize_t) :: g_size(ndims), g_start(ndims)

        real(kind=r_dp), allocatable :: ld(:,:)
        ! Timing vars
        real(kind=r_dp) :: s, e, dt, mdt

        argc = 0
        ierr = 0
        offset = 0
        m_dims = (/ 0, 0/)
        is_periodic = .false.      ! Non-periodic
        reorder     = .false.      ! Not allowed to reorder

        call mpi_init(ierr)

        ! Set up the MPI cartesian topology
        call mpi_comm_size(MPI_COMM_WORLD, np, ierr)
        call mpi_dims_create(np, ndims, m_dims, ierr)

        call mpi_cart_create(MPI_COMM_WORLD, ndims, m_dims, is_periodic, &
                             reorder, MPI_COMM_2D, ierr)
        call mpi_comm_rank(MPI_COMM_2D, id, ierr)
        call mpi_cart_coords(MPI_COMM_2D, id, ndims, coords, ierr)

        if (id .eq. 0) then
                if (mod(N,np) .ne. 0) then
                        write(0,*) 'Must use divisiable number of procs.'
                        call mpi_abort(MPI_COMM_WORLD, 1, ierr)
                endif

                ! get the filename
                argc = iargc()
                if (argc .lt. 1 ) then
                        write(0, *) 'Must supply a filename'
                        call exit(1)
                endif
                call get_command_argument(1, filename)
        endif

        ! Broadcast the filename
        call mpi_bcast(filename, len(filename), MPI_CHAR, 0, &
                       MPI_COMM_WORLD, ierr)

        ! Init the HDF5 library
        call h5open_f(ierr)

        ! Set a stripe count of 4 and a stripe size of 4MB
        lcount = 4
        lsize  = 4 * 1024 * 1024
        write(clcount, '(I4)') lcount
        write(clsize, '(I8)') lsize

        call mpi_info_create(info, ierr)
        call mpi_info_set(info, "striping_factor", trim(clcount), ierr)
        call mpi_info_set(info, "striping_unit", trim(clsize), ierr)

        ! Set up the access properties
        call h5pcreate_f(H5P_FILE_ACCESS_F, p_id, ierr)
        call h5pset_fapl_mpio_f(p_id, MPI_COMM_2D, info, ierr)

        ! Open the file
        call h5fcreate_f(filename, H5F_ACC_TRUNC_F, f_id, ierr, &
                         access_prp = p_id)
        if (ierr .ne. 0) then
                write(0,*) 'Unable to open: ', trim(filename), ': ', ierr
                call mpi_abort(MPI_COMM_WORLD, 1, ierr)
        endif

        ! Generate our 4000x4000 matrix with a 1x1 halo
        total = N + 2 * halo
        allocate(ld(0:total-1, 0:total-1))

        ld = -99.99
        ! init the local data
        do j = 1, N
                do i = 1, N
                        ld(i,j) = (i - 1 + (j-1)*N)
                enddo
        enddo

        ! Create the local memory space and hyperslab
        do i = 1, ndims
                d_size(i) = total
                s_size(i) = N
                h_size(i) = halo
                stride(i) = 1
                block(i)  = 1
        enddo

        call h5screate_simple_f(ndims, d_size, memspace, ierr)
        call h5sselect_hyperslab_f(memspace, H5S_SELECT_SET_F, &
                                   h_size, s_size, ierr,       &
                                   stride, block)

        ! Create the global file space and hyperslab
        do i = 1, ndims
                g_size(i)  = N * m_dims(i)
                g_start(i) = N * coords(i)
        enddo

        call h5screate_simple_f(ndims, g_size, filespace, ierr)
        call h5sselect_hyperslab_f(filespace, H5S_SELECT_SET_F, &
                                   g_start, s_size, ierr,       &
                                   stride, block)

        ! Create a data transfer property
        call h5pcreate_f(H5P_DATASET_XFER_F, x_id, ierr)
        call h5pset_dxpl_mpio_f(x_id, H5FD_MPIO_COLLECTIVE_F, ierr)

        ! Create the dataset id
        call h5dcreate_f(f_id, "/data", H5T_IEEE_F64LE, filespace, d_id, &
                         ierr)


        ! Write the data
        call get_walltime(s)
        call h5dwrite_f(d_id, H5T_NATIVE_DOUBLE, ld, s_size, ierr,      &
                        file_space_id=filespace, mem_space_id=memspace, &
                        xfer_prp=x_id)
        call get_walltime(e)

        dt = e - s
        call mpi_reduce(dt, mdt, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_2D, ierr)

        if (id .eq. 0) then
                write(6,*) mdt / np
        endif

        if (allocated(ld)) then
                deallocate(ld)
        endif

        ! Close everything and exit
        call h5dclose_f(d_id, ierr)
        call h5sclose_f(filespace, ierr)
        call h5sclose_f(memspace, ierr)
        call h5pclose_f(x_id, ierr)
        call h5pclose_f(p_id, ierr)
        call h5fclose_f(f_id, ierr)
        call h5close_f(ierr)

        call mpi_finalize(ierr)
end program hdf_pwrite

请注意,这是我的教学示例,我以交互方式让班级参与其中。所以里面有一些不同的东西。

  1. I介绍iso_c_binding是因为我们在C (gettimeofday)包装器中有一个计时例程。
  2. I使用MPI MPI根级别是处理文件名以进行写入的唯一级别,然后我们将其广播给所有级别。
  3. 我们为lustre文件系统设置条带计数和大小。
  4. 为data placement.
  5. Use MPI集合调用使用超级片。

希望这能有所帮助。

票数 1
EN

Stack Overflow用户

发布于 2015-03-16 12:02:11

你计算你想要并行写入的数据吗?如果是这样的话,你需要确保在你写之前所有的工作者都已经完成了他们的处理,这样你的数据实际上是完整的。

换句话说,

代码语言:javascript
运行
AI代码解释
复制
// Collect all the data using some form of MPI_Collect, MPI_Reduce
// or whatevs. I'll just put this here for proof-of-concept
MPI_Barrier();

// Now, all the threads have "joined", so you can write from 0 without worrying
// that some other thread got here way before
if (currentThread == 0) { createdHDF5File(); }

如果不是,我假设您想要从每个线程写入数据。为什么不把它写到不同的文件中呢?

代码语言:javascript
运行
AI代码解释
复制
// Calculate stuff on each thread
// Then write to different files depending on thread num
createHDF5File(currentThread); // Chooses file name that includes the thread num
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29075591

复制
相关文章
使用Google的Quickdraw创建MNIST样式数据集!
对于那些运行深度学习模型的人来说,MNIST是无处不在的。手写数字的数据集有许多用途,从基准测试的算法(在数千篇论文中引用)到可视化,比拿破仑的1812年进军更为普遍。数字如下所示: 它经久不
AiTechYun
2018/03/02
1.7K0
使用Google的Quickdraw创建MNIST样式数据集!
R In Action|创建数据集
1)向量(vector):用于存储数值型、字符型或逻辑型数据的一维数组。函数c()用来创建向量:
生信补给站
2020/08/06
1.6K0
【猫狗数据集】pytorch训练猫狗数据集之创建数据集
链接:https://pan.baidu.com/s/1l1AnBgkAAEhh0vI5_loWKw 提取码:2xq4
西西嘛呦
2020/08/26
1.1K0
【猫狗数据集】pytorch训练猫狗数据集之创建数据集
大数据存储_hdf5 简介
HDF5 (Hierarchical Data Format) 是由美国伊利诺伊大学厄巴纳-香槟分校,是一种跨平台传输的文件格式,存储图像和数据
火星娃统计
2021/02/05
6.6K0
大数据存储_hdf5 简介
CESM 2.1.1 移植指南(CentOS 7.6)
CESM是一个完全耦合的地球系统的数值模拟,由大气、海洋、冰、陆地表面、碳循环和其他组成部分组成。CESM包括一个气候模型,提供地球过去、现在和未来的模拟。CESM是CCSM的升级版,2010年,国家科学基金会(NSF)和美国能源部(DoE)的重要资金(NSF)和重要资金的全球动力学部门(CGD)在2010年发布了CESM1。
bugsuse
2020/12/16
4.1K0
CESM 2.1.1 移植指南(CentOS 7.6)
使用Docker创建MongoDB复制集
MongoDB复制集由一组MongoDB实例节点组成,包含一个Primary节点、多个Secondary节点 客户端写入的数据会被写入Primary节点,Secondary节点从Primary节点自动同步数据,保持所有成员的数据相同,提供数据库的高可用性 MongoDB复制集的配置非常简单,只需要指定复制集中包含哪些节点就好了 不需要我们指定哪个节点是Primary,会自动选举出来,其他节点便成为Secondary,自动与Primary同步,当Primary坏掉后,也会自动从多个Secondary中重新
dys
2018/04/03
1.3K0
使用Docker创建MongoDB复制集
CESM 2.1.1 移植指南(CentOS 7.6)
CESM是一个完全耦合的地球系统的数值模拟,由大气、海洋、冰、陆地表面、碳循环和其他组成部分组成。CESM包括一个气候模型,提供地球过去、现在和未来的模拟。CESM是CCSM的升级版,2010年,国家科学基金会(NSF)和美国能源部(DoE)的重要资金(NSF)和重要资金的全球动力学部门(CGD)在2010年发布了CESM1。
MeteoAI
2020/12/22
3.1K0
CESM 2.1.1 移植指南(CentOS 7.6)
WenetSpeech数据集的处理和使用
WenetSpeech数据集 包含了10000+小时的普通话语音数据集,所有数据均来自 YouTube 和 Podcast。采用光学字符识别(OCR)和自动语音识别(ASR)技术分别标记每个YouTube和Podcast录音。为了提高语料库的质量,WenetSpeech使用了一种新颖的端到端标签错误检测方法来进一步验证和过滤数据。
夜雨飘零
2021/12/07
2.2K0
WenetSpeech数据集的处理和使用
centos安装openmpi
通过官方网站提供的下载地址:https://download.open-mpi.org/release/open-mpi/v3.1/openmpi-3.1.0.tar.gz,下载3.1版的openmpi,在命令行执行如下命令,会将openmpi-3.1.0.tar.gz文件下载到当前目录:
俊采
2018/07/30
5K0
OpenMPI&cmake配置
MPI程序编译时的Cmake cmake_minim_required(VERSION 2.7) project(ITK_MPI) find_package(MPI REQUIRED) include_directories(${MPI_INCLUDE_PATH}) add_executable(hello hello.cpp) target_link_libraries(hello ${MPI_LIBRARIES}) if(MPI_COMPILE_FLAGS) set_target_prope
Pulsar-V
2019/03/12
9300
Pytorch创建自己的数据集
这里的mnist数据集并不是torchvision里面的,而是我自己的以图片格式保存的数据集,因为我在测试STN时,希望自己再把这些手写体做一些形变,
TeeyoHuang
2019/05/25
3.5K0
创建数据集模块常见设置
本文介绍了永洪BI在创建数据集模块中的常见设置,包括新建层次、新建文件夹、设置字段别名、设置字段可见性、设置数据加载条数以及数据级别的权限设置。同时,本文还提供了相应的示例和截图,以帮助用户更好地理解设置的方法和意义。通过这些设置,用户可以更好地组织和管理数据,并利用永洪BI的强大分析功能进行数据分析。
腾讯云商业智能分析团队
2017/09/05
1.5K0
创建数据集模块常见设置
hdf5 模块使用方法
此时KeysV显示iew(<HDF5 file "your_file_name" (mode r+)>) 如果想要显示内部的数据集名称,需要使用list,即
羽翰尘
2019/11/21
7960
Ubuntu: HDF5报错: HDF5 header version与HDF5 library不匹配
Warning! ***HDF5 library version mismatched error***
知忆
2021/06/16
1.6K0
[Oracle ASM全解析] 使用SQL*Plus创建数据库文件
一般来说我们推荐使用DBCA来创建数据库,当我们需要手动命令创建的时候可以指定使用ASM,下面的语句创建一个数据库
bsbforever
2020/08/19
1.9K0
OpenMPI(一) 点对点通信
如果发送的字节数等于接收的字节数,通信将成功。例如,可以发送一个包含两个int的数组,并接收一个long或者一个double。
Pulsar-V
2019/03/12
1.3K0
Ubuntu - openmpi 源码安装
Ubuntu - openmpi 源码安装 sudo apt-get install openmpi # 安装版本比较低 1. Ubuntu 程序源码安装 主要包括三个步骤: 1 - ./configure  2 - make  3 - make install 这些都是典型的使用GNU的AUTOCONF和AUTOMAKE产生的程序的安装步骤。 ./configure是用来检测你的安装平台的目标特征的。比如它会检测你是不是有CC或GCC,并不是需要CC或GCC,它是个shell脚本。 m
AIHGF
2018/05/17
4.7K0
使用ScriptableObject创建.asset文件
定义为public的变量就存储在xxx.asset中,通过 CommonConfig.Instance.Get 直接获取数据。
meteoric
2018/11/20
1.4K0
【说站】python如何查看hdf5文件
以上就是python查看hdf5文件的方法,希望对大家有所帮助。更多Python学习指路:python基础教程
很酷的站长
2022/11/23
1.8K0
【说站】python如何查看hdf5文件
数据集 | 共享单车使用量数据集
自行车共享系统是传统自行车的新一代租赁方式,从会员资格,租赁和返还的整个过程已实现自动化。通过这些系统,用户可以轻松地从特定位置租借自行车,然后返回另一个位置。目前,全球约有500多个自行车共享计划,其中包括50万多辆自行车。如今,由于它们在交通,环境和健康问题中的重要作用,人们对这些系统引起了极大的兴趣。除了自行车共享系统在现实世界中的有趣应用之外,这些系统生成的数据的特性使它们对研究具有吸引力。与其他运输服务(例如公共汽车或地铁)相反,在这些系统中明确记录了旅行的持续时间,出发和到达的位置。此功能将自行车共享系统转变为虚拟传感器网络,可用于感测城市中的机动性。因此,期望通过监视这些数据可以检测到城市中的大多数重要事件。数据集中包括了美国共享单车公司Capital Bikeshare在华盛顿地区2011年和2012年的使用量历史记录,以及每天对应的天气信息。
数据科学人工智能
2022/03/30
1.6K0
数据集 | 共享单车使用量数据集

相似问题

如何使用macport安装HDF5、openMPI .mod文件?

10

HDF5 :使用字符串创建数据集

13

从多个hdf5组创建数据集

29

在HDF5文件中创建和访问数据集

10

搜索HDF5数据集

45
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文