Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在混合MPI/OpenMP程序中使用MPI I/O_C_Performance_Io_Mpi_Openmp - Fatal编程技术网

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

C 在混合MPI/OpenMP程序中使用MPI I/O,c,performance,io,mpi,openmp,C,Performance,Io,Mpi,Openmp,为了解决性能和可伸缩性问题,我正在将现有MPI代码转换为混合MPI/OpenMP。在最初的MPI代码中,我使用了集体MPI I/O(特别是MPI文件写入/读取),现在我将其转换为混合模式,我不知道如何在不降低性能的情况下使用I/O。我目前使用的系统有多个32核的节点,我的计划是每个节点运行1个MPI进程,每个节点内运行32个线程。系统和编译器(PGI)支持MPI_THREAD_MULTIPLE,并具有基于Lustre的并行文件系统。我的代码类似于: #include "mpi.h" #inclu

为了解决性能和可伸缩性问题,我正在将现有MPI代码转换为混合MPI/OpenMP。在最初的MPI代码中,我使用了集体MPI I/O(特别是MPI文件写入/读取),现在我将其转换为混合模式,我不知道如何在不降低性能的情况下使用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;
}
#包括“mpi.h”
#包括“omp.h”
#定义第32行
int main()
{
提供int;
int myrank、纽普罗克、tid;
双b[BIGSIZE]={0};
国际热核实验堆;
MPI_Init_线程(0、0、MPI_线程数,&提供);
omp_设置_数量_线程(n线程);
/*初始化b*/
#pragma omp parallel private(i,一些变量)\
共享(b和其他一些东西)\
默认值(无)
{
/*在每个线程内:*/

对于(i=0;i我认为您过早地针对可能没有的问题进行了优化

从使计算与OpenMP并行开始,加入一些OpenMP屏障,继续像以前一样进行IO

对代码进行基准测试/计时,如果IO成为性能的一大障碍,请尝试进行优化。您可能会发现,您建议的内容实际上比总体版本的性能更差。无论哪种方式,在优化之前都要对您当前的性能进行量化处理


如果你非常渴望速度,你能做的最快、最简单的事情之一就是将每个线程写入一个单独的文件,然后在后期处理中合并这些文件。我发现这很难做到,所以将其作为最后的手段。

只是一个附带问题,你使用哪种MPI实现?我使用mvapich2和pgi c编译器+1。OP:你可能会在上,我们不希望每个节点有32个线程/进程同时写入磁盘;每个节点可能只有一个通向FS的管道,而32个任务争用FS可能会对性能造成影响。可能一个任务无法充分利用连接;但最简单的处理方法是尝试每个节点有2个或更多MPI任务,这是经常发生的en有利于NUMA性能等。@hbcdev是绝对正确的;虽然这些问题值得记住,但在你开始获取一些真实数据并了解瓶颈是什么之前,它们还不值得构建。Jonathan,你当然知道他是否使用集体I/O关注点,如“有多少节点上的任务为I/O而斗争”当两阶段选择聚合器时,获得优化(在大多数MPI-IO实现中)。感谢各位,我把它作为主线程使用,现在它运行良好。