我目前正在处理由于内存不足而在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版本,所需的额外内存量似乎因所选版本而异。
有人知道为什么会这样,尤其是我如何解决这个问题?
非常感谢你的帮助和祝福
克劳斯