HDF5写入失败,即使在OpenMP关键部分也是如此

时间:2019-01-29 09:42:41

标签: c++ openmp hdf5

我一直在寻找编写一个大的4维HDF5文件,该文件中的值是并行计算并互斥的。

这是解决我的问题的最小方法。

#include <fstream>
#include <iostream>
#include <algorithm>
#include <vector>

#include <omp.h>
#include "H5Cpp.h"
using namespace H5;

int main(int argc, char *argv[])
{
    H5File file("out.h5", H5F_ACC_TRUNC);

    const uint F_RANK = 4;
    const uint M_RANK = 3;

    const uint D = 8;
    const uint MD = 2;
    std::vector<hsize_t> fdim = {D, D, 6, 1024};
    std::vector<hsize_t> count = {1, 1, 6, 1024};
    std::vector<hsize_t> mdim = {MD, 6, 1024};

    float fillvalue = -1.0;
    DSetCreatPropList plist;
    plist.setFillValue(PredType::NATIVE_FLOAT, &fillvalue);

    DataSpace fspace(F_RANK, fdim.data());
    DataSet dataset = file.createDataSet("data", PredType::NATIVE_FLOAT, fspace, plist);

    #pragma omp parallel
    {
        uint id = omp_get_thread_num();
        std::vector<hsize_t> start(F_RANK, 0);
        DataSpace private_fspace = dataset.getSpace();
        DataSpace private_mspace(M_RANK, mdim.data());
        private_mspace.selectAll();
        std::cout << "THREAD " << id << " STARTS" << std::endl;
        #pragma omp for ordered schedule(static)
        for (uint b = 0; b < D*D / MD; b++)
        {
            // Assume this is an expensive computation
            std::vector<float> data(MD*6*1024, b);
            #pragma omp critical
            {
                private_fspace.selectNone();
                std::cout << "THREAD " << id << " SELECTED NONE" << std::endl;

                // Store batch
                for (uint p = 0; p < MD; p++)
                {
                    start[0] = b / (D*D) + p;
                    start[1] = p;
                    private_fspace.selectHyperslab(H5S_SELECT_OR, count.data(), start.data());
                    std::cout << "THREAD " << id << " SELECTED " << start[0] << ' ' << start[1] << std::endl;
                }

                std::cout << "ABOUT TO WRITE " << private_fspace.getSelectNpoints() << std::endl;
                dataset.write(data.data(), PredType::NATIVE_FLOAT, private_mspace, private_fspace);
                private_fspace.selectNone();
            }
            std::cout << "WRITTEN" << std::endl;
        }
    }

}

我正在使用h5c++ example.cpp -fopenmp对其进行编译。

运行时,可能会发生许多可能的错误,有些是分段错误,有些是中止甚至是总线错误。 甚至还有一些HDF5库错误

HDF5: infinite loop closing library
    L,T_top,P,P,Z,FD,E,SL,FL,FL,.....

有时它会在写入任何内容之前失败,有时它会完成而没有任何错误。当然,只有将OMP_NUM_THREADS设置为大于1时,它才会失败,因此问题出在并行性上。但是,我已经为每个进程设置了所有相关变量,我可以将其设置为私有变量,并且所有事情都发生在关键部分中,所以我看不出这是怎么回事。

在GDB上进行的调试显示,HDF5可能会在DataSet :: getSpace()上失败,并出现分段错误,但是失败的方法有很多,我会说问题比这更普遍。

0 个答案:

没有答案