OpenMPI:MPI_Send分配越来越多的内存

时间:2016-11-17 16:55:51

标签: c++ memory mpi send openmpi

我目前正在处理由于内存不足而在MPI通信期间崩溃的代码。我想知道为什么代码使用越来越多的内存,因为我试图尽可能地减少分配。我的一所大学的代码也有类似的问题。

所以我发现这似乎是由我的send和recv例程引起的,因此我写了一个显示类似行为的例子(以较小的比例):

class Element {
  constructor(app) {
    this.App = app;
    this.elements = [];
  }
  addElement(name) {
    // ...
    this.App.layer.foo(); // I can talk with Layer class
  }
}

module.exports = Element;

使用2个核心运行此代码会产生以下输出:

#include <mpi.h>
#include <stdio.h>
#include <sys/resource.h>
#include <iomanip>

rusage mem_usage;
int mem_proc;
int mem_max;
int mem_min;
int mem_sum;
int mem_sum_old;
double mem_avg;

int world_size;
int world_rank;


void PrintMemUsage(std::string prefix)
{
    MPI_Barrier(MPI_COMM_WORLD);

    getrusage( RUSAGE_SELF, &mem_usage);

    mem_proc = mem_usage.ru_maxrss;

    MPI_Allreduce(&mem_proc,&mem_sum,1,MPI_INT,MPI_SUM,MPI_COMM_WORLD);
    MPI_Allreduce(&mem_proc,&mem_min,1,MPI_INT,MPI_MIN,MPI_COMM_WORLD);
    MPI_Allreduce(&mem_proc,&mem_max,1,MPI_INT,MPI_MAX,MPI_COMM_WORLD);


    mem_avg = ((double) mem_sum) / ((double) world_size);

    if(mem_sum_old == 0)
        mem_sum_old = mem_sum;

    if(world_rank == 0) std::cout << "("<< world_rank << ") " << std::setw(50) << std::left << prefix << " MEM: " << mem_sum << " KB.  MIN: " << mem_min << " MAX: " << mem_max << " AVG: " << mem_avg << " Change: " << (mem_sum)-(mem_sum_old) << " KB" << std::endl;
    mem_sum_old = mem_sum;
}


int main(int argc, char** argv) {
    MPI_Init(NULL, NULL);
    MPI_Comm_size(MPI_COMM_WORLD, &world_size);
    MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);

    double send = 42.0;
    double recv = 1;
    int i;
    MPI_Request Request[2];

    PrintMemUsage("start");

    for(i = 0; i < 10000; ++i)
    {
        MPI_Send (&send, 1, MPI_DOUBLE, (world_rank+1)%world_size, i, MPI_COMM_WORLD);
        MPI_Recv (&recv, 1, MPI_DOUBLE, (world_rank-1)%world_size, i, MPI_COMM_WORLD, MPI_STATUS_IGNORE);           
    }

    PrintMemUsage("end");

    MPI_Finalize();
}

所需内存随着更多核心的增加而上升。因此,似乎send和recv函数分配的内存越来越多。将输出放入循环显示附加内存未分配一次,它被分配多次(但并非总是)。

我已经使用gcc 4.9.2和MPI 1.8.3测试了几个MPI和GCC版本,所需的额外内存量似乎因所选版本而异。

有人知道为什么会这样,尤其是我如何解决这个问题?

非常感谢你的帮助和祝福

克劳斯

0 个答案:

没有答案