使用MPISend和MPISreceive时,主节点上的内存使用量增加
我正在使用MPI编写一个程序,其中主节点将任务分配给从节点。每个从节点在本地执行任务,并将结果(大小为100000的int数组)发送给主节点 虽然我得到了正确的结果,但内存使用不是线性的。我发现主节点占用N*m内存,其中N是节点数,m是从节点通常使用的内存 任何人都知道为什么会发生这种情况,并且有任何解决方案可以减少主节点上的内存使用 下面是示例代码,其中从节点向主节点发送一些数据/结果,我想知道为什么主节点使用的内存是N*m。我使用Linux命令top检查了内存使用情况使用MPISend和MPISreceive时,主节点上的内存使用量增加,mpi,Mpi,我正在使用MPI编写一个程序,其中主节点将任务分配给从节点。每个从节点在本地执行任务,并将结果(大小为100000的int数组)发送给主节点 虽然我得到了正确的结果,但内存使用不是线性的。我发现主节点占用N*m内存,其中N是节点数,m是从节点通常使用的内存 任何人都知道为什么会发生这种情况,并且有任何解决方案可以减少主节点上的内存使用 下面是示例代码,其中从节点向主节点发送一些数据/结果,我想知道为什么主节点使用的内存是N*m。我使用Linux命令top检查了内存使用情况 #include<
#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();
}
#包括
#包括
使用名称空间std;
int main(int argv,char*argp[256])
{
整数秩,大小,主秩=0,i=0;
intjc=0,jpt,jobsperthread=0,exjpt=0;;
int ii=0,索引=0,剩余=0,tobesent=0,tobereceived=0;
int-totsendreceivesize=100000,k=0;
int-innodes=11;
MPI_状态;
int*arr_anti_net=(int*)malloc(sizeof(int)*(totsendreceivesize+100));
MPI_Init(&argv,&argp);
MPI通信等级(MPI通信世界和等级);
MPI_通信大小(MPI_通信世界和大小);
对于(i=0;请让我试着理解您的意思:有N
节点将其大小m
的结果发送给主节点,您想知道主节点为什么需要N*m
内存?您需要提供一些代码并更具体地描述结果的结构,以接收适当的答案。您的程序确实发送了一个从每个从机接收391条小消息(为什么?),但从主机上的每个从机只接收一条小消息。在这一点上,我甚至不关心内存使用情况:1)了解如何正确使用点对点通信2)使用适当的集体通信(例如,MPI_Gather
3)关心记忆-按顺序。