并行HDF5 C++;为每个MPI进程列组创建一个组的程序 我试图找到一个使用HDP5的C++接口中的MPIO驱动程序并行打开和关闭HDF5文件的最小例子,它为每个MPI进程等级创建一个HDF5组,并保存文件。并不是我所说的最小值,但我尝试使用该示例的部分内容,以及

并行HDF5 C++;为每个MPI进程列组创建一个组的程序 我试图找到一个使用HDP5的C++接口中的MPIO驱动程序并行打开和关闭HDF5文件的最小例子,它为每个MPI进程等级创建一个HDF5组,并保存文件。并不是我所说的最小值,但我尝试使用该示例的部分内容,以及,c++,hdf5,C++,Hdf5,这就是我到目前为止的想法: 编辑:我在MPI列组上添加了一个循环,以尝试在集体模式下创建HDF5组,结果是相同的 #include <iostream> #include <mpi.h> #include <sstream> #include <iostream> #include <memory> using std::cout; using std::endl; #include <string> #include "

这就是我到目前为止的想法:

编辑:我在MPI列组上添加了一个循环,以尝试在集体模式下创建HDF5组,结果是相同的

#include <iostream>
#include <mpi.h>
#include <sstream>
#include <iostream>
#include <memory>
using std::cout;
using std::endl;

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

int main(void)
{
    MPI_Init(NULL, NULL); 

    // Get the number of processes
    int size;
    MPI_Comm_size(MPI_COMM_WORLD, &size);

    // Get the rank of the process
    int rank;
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);

    auto acc_tpl1 = H5Pcreate(H5P_FILE_ACCESS);
    /* set Parallel access with communicator */
    H5Pset_fapl_mpio(acc_tpl1, MPI_COMM_WORLD, MPI_INFO_NULL);

    // Creating the file with H5File stores only a single group with 4 MPI processes.
    auto testFile = H5File("test.h5", H5F_ACC_TRUNC, H5P_DEFAULT, acc_tpl1);

    for (unsigned int i = 0; i < size; ++i)
    {
        std::stringstream ss; 
        ss << "/RANK_GROUP" << rank; 
        string rankGroup {ss.str()}; 
        // Create the rank group with testFile.
        if (! testFile.exists(rankGroup))
        {
            cout << rankGroup << endl; 
            testFile.createGroup(rankGroup);
        }
    }

    // Release the file-access template 
    H5Pclose(acc_tpl1);

    // Release the testFile 
    testFile.close();

    MPI_Finalize();

    return 0;
}
<> P>我需要改变什么,让这个最小的并行示例用C++ API运行到HDF5?p> 在HDF5中,所有“元数据”必须由所有列组以集体模式创建。也就是说:每个处理器将打开文件,创建所有组,创建所有数据集。然后,可以分别写入指定的数据集。注意,在可扩展数据集的情况下,还必须集体调整大小

实际上:必须在程序中循环以创建组、属性和数据集

原因是每个级别都必须知道HDF5文件的整个布局

在某些情况下,另一种方法是为每个列组编写一个hdf5文件。对于完全独立的团体来说,这是有意义的


该页面列出了必须在“集合”模式下调用的例程。所有API(C、C++、FORTRAN等)的要求都相同。在上面的例子中,

不是集体模式下调用的“文件?CeaGeGo”?我没有类似于
if(rank==3){file.createGroup(groupPath)}。或者我必须设置一些标志来确保并行操作在集体模式下运行吗?在您的代码中,每个列组都编写自己的组。在集体模式下,必须在每个处理器上调用/执行操作。这就是我提到循环的原因:所有处理器必须创建
RANK\u GROUP0
RANK\u GROUP1
,等等。谢谢,明白了!关于代码的另外一个问题是:如何使用C++接口获得与 H5pStIsFaPLIMPioO相同的结果,您是否知道C++ API中的哪个类负责?我不熟悉C++ API。根据1集合_fapl和2的等价物。这个C++ API不支持并行HDF5接口。你可以使用C++中的纯C API,但是你已经开始这么做了。你可能会对C++插件感兴趣,它只依赖于HDF5的C API。
?> h5c++ test-mpi-group-creation.cpp  -o test-mpi-group-creation
?> mpirun -np 4 ./test-mpi-group-creation
/RANK_GROUP0
/RANK_GROUP1
/RANK_GROUP2
/RANK_GROUP3
?> h5ls -lr test.h5 
/                        Group
/RANK_GROUP1             Group