在混合MPI / OpenMP程序中使用MPI I / O.

时间:2012-11-13 04:43:59

标签: c performance io mpi openmp

我正在将现有的MPI代码转换为混合MPI / OpenMP,以解决性能和可伸缩性问题。在原始的MPI代码中,我使用了集体MPI I / O(特别是MPI_File_write / read_at_all),现在我将其转换为混合模式,我不知道如何使用I / O而不会失去性能。我目前使用的系统有32个内核的多个节点,我的计划是每个节点运行1个MPI进程,每个节点内运行32个线程。系统和编译器(PGI)支持MPI_THREAD_MULTIPLE并具有基于Lustre的并行文件系统。我的代码类似于:

#include "mpi.h"
#include "omp.h"
#define NTHREADS 32
int main()
{
    int provided;
    int myrank,numproc,tid;
    double b[BIGSIZE]={0.};
    int iter,i;

    MPI_Init_thread( 0, 0, MPI_THREAD_MULTIPLE, &provided );
    omp_set_num_threads(NTHREADS);

    /* Initialize b */

    #pragma omp parallel private(i,some variables)\
                         shared(b and some other stuffs)\
                         default(none)
    {
        /* Inside each thread: */
        for (i=0;i<iter;i++)
        {
            /* each thread of each process do work on few elements of variable b */
            /* 2 threads do less work and communicate with the other processes  */
            /* Write the variable b's of all MPI processes in one file */
            /* b is actually divided between MPI processes and then is divided
               between threads inside each process, so the work is distributed */
            /* write operation MUST be complete before the next iteration starts */
        }
    }
    MPI_Finalize();
    return 0;
}

现在我的问题是如何处理写入部分以获得最佳性能,我是一名机械工程师,所以我不熟悉可能的解决方案。在我开始研究之前,我想看看是否有类似案例的标准方法,我的想法是:

  1. 在每个线程中使用MPI_File_write_at并忘记集合版本,(我不确定这是否真的正确,我可以使用MPI_Barrier和omp_barrier等待完成吗?),我将如何定义文件指针?私人还是共享?
  2. 在主指令的主线程中使用MPI_File_write_at_all,并使用屏障保持其余线程空闲。
  3. 还有其他可能的方法吗?
  4. 代码的性能和可扩展性对我来说非常关键,我需要你们的帮助!

    由于

1 个答案:

答案 0 :(得分:2)

我认为你过早地优化了你可能没有的问题。

首先使计算与OpenMP并行,坚持一些OpenMP障碍并继续像以前那样进行IO。

代码的基准/时间,如果IO成为性能的一大障碍,请尝试进行优化。你可能会发现你所建议的东西实际上比集体版本的性能更差。无论哪种方式,在优化之前定量处理当前的性能。

如果你急需速度,你可以做的最快和最简单的事情之一就是将每个线程写入一个单独的文件,然后在后处理中合并这些文件。我发现这很漂亮,所以会留下它作为最后的手段。