C 在混合MPI/OpenMP程序中使用MPI I/O
为了解决性能和可伸缩性问题,我正在将现有MPI代码转换为混合MPI/OpenMP。在最初的MPI代码中,我使用了集体MPI I/O(特别是MPI文件写入/读取),现在我将其转换为混合模式,我不知道如何在不降低性能的情况下使用I/O。我目前使用的系统有多个32核的节点,我的计划是每个节点运行1个MPI进程,每个节点内运行32个线程。系统和编译器(PGI)支持MPI_THREAD_MULTIPLE,并具有基于Lustre的并行文件系统。我的代码类似于: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
#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实现中)。感谢各位,我把它作为主线程使用,现在它运行良好。