0

我正在使用 MPI 编写一个程序,其中主节点将任务分配给从节点。每个从节点在本地执行任务并将结果(大小为 100000 的 int 数组)发送到主节点。

虽然我得到了正确的结果,但内存使用并不是线性的。我发现主节点占用 N*m 内存,其中 N 是节点数,m 是从节点通常使用的内存。

任何人都知道为什么会发生这种情况,是否有任何解决方案可以减少主节点上的内存使用。

这是从节点向主节点发送一些数据/结果的示例代码,我想知道为什么主节点使用的内存是 N*m。我使用 Linux 命令 top 检查了内存使用情况。

#include<iostream>  
#include <mpi.h>
using namespace std;
int main(int argv, char *argp[256])
{
    int rank,size,master_rank=0,i=0;
    int jc=0,jpt,jobsperthread=0,exjpt=0;;
    int ii=0,index=0,remaining=0,tobesent=0,tobereceived=0;
    int totsendreceivesize=100000,k=0;
    int innodes=11;
    MPI_Status status;
    int *arr_anti_net=(int*)malloc(sizeof(int)*(totsendreceivesize+100));
    MPI_Init (&argv, &argp);
    MPI_Comm_rank (MPI_COMM_WORLD, &rank);
    MPI_Comm_size (MPI_COMM_WORLD, &size);
    for(i=0;i<totsendreceivesize;i++)
       arr_anti_net[i]=i
    if(rank!=master_rank)
    {
       remaining=totsendreceivesize;
       tobesent=256;
       k=0;
       while(remaining!=0)
       {
        if(remaining<256)
            tobesent=remaining;
        MPI_Send(&arr_anti_net[k],tobesent,MPI_INT,0,11,MPI_COMM_WORLD);
        k+=tobesent;
        remaining-=tobesent;
       }
    }
    else
    {
       ii=0;
       index=0;
       for(ii=1;ii<size;ii++)
       {
           jc=0;
           jpt=0;
           jobsperthread=innodes/size;
           jpt=innodes/size;
           exjpt=0;
           if(innodes%size!=0)
           {
            if(ii<innodes%size)
            {
                jobsperthread+=1;
                exjpt=ii;
            }
            else
                exjpt=innodes%size;
           }
           remaining=256;//totsendreceivesize;
           tobereceived=256;
           k=0;
           while(remaining!=0)
           {
            if(remaining<256)
                tobereceived=remaining;
            MPI_Recv(& arr_anti_net[k],tobereceived,MPI_INT,ii,11,MPI_COMM_WORLD,&status);
            k+=tobereceived;
            remaining-=tobereceived;
           }
       }
      }
   MPI_Barrier(MPI_COMM_WORLD);

   MPI_Finalize();
}

非常感谢

4

0 回答 0