MPI接收/收集动态向量长度
我有一个存储结构向量的应用程序。这些结构保存关于系统上每个GPU的信息,如内存和千兆次/秒。每个系统上有不同数量的GPU 我有一个同时在多台机器上运行的程序,我需要收集这些数据。我对MPI非常陌生,但大部分情况下都能使用MPI接收/收集动态向量长度,mpi,gpgpu,multi-gpu,Mpi,Gpgpu,Multi Gpu,我有一个存储结构向量的应用程序。这些结构保存关于系统上每个GPU的信息,如内存和千兆次/秒。每个系统上有不同数量的GPU 我有一个同时在多台机器上运行的程序,我需要收集这些数据。我对MPI非常陌生,但大部分情况下都能使用MPI\u Gather(),不过我想知道如何收集/接收这些动态大小的向量 class MachineData { unsigned long hostMemory; long cpuCores; int cudaDevices; public:
MPI\u Gather()
,不过我想知道如何收集/接收这些动态大小的向量
class MachineData
{
unsigned long hostMemory;
long cpuCores;
int cudaDevices;
public:
std::vector<NviInfo> nviVec;
std::vector<AmdInfo> amdVec;
...
};
struct AmdInfo
{
int platformID;
int deviceID;
cl_device_id device;
long gpuMem;
float sgflops;
double dgflops;
};
class-MachineData
{
无符号长内存;
长孔;
int cudaDevices;
公众:
std::向量nviVec;
std::载体amdVec;
...
};
结构AmdInfo
{
内平台状;
内部设备ID;
cl_设备\u id设备;
长gpuMem;
浮点数;
双dgflops;
};
集群中的每台计算机都填充其
MachineData
的实例。我想收集这些实例中的每一个,但我不确定如何收集nviVec
和amdVec
,因为它们的长度在每台机器上都不同。您可以将MPI\u GATHERV
与MPI\u gather
结合使用来实现这一点MPI\u GATHERV
是MPI\u GATHER
的可变版本,它允许根列组从每个发送进程收集不同数量的元素。但是为了让根秩指定这些数字,它必须知道每个秩包含多少元素。在此之前,可以使用简单的单一元素MPI\u聚集
实现这一点。大概是这样的:
//为了简单起见:root被固定为秩0,并使用MPI\u COMM\u WORLD
//MPI进程数和当前排名
整数大小、等级;
MPI_通信大小(MPI_通信世界和大小);
MPI通信等级(MPI通信世界和等级);
整数*计数=新整数[大小];
int neelements=(int)vector.size();
//每个进程都告诉根目录它包含多少元素
MPI_聚集(和元素,1,MPI_INT,计数,1,MPI_INT,0,MPI_COMM_WORLD);
//MPI_GATHERV接收缓冲区中的位移
int*disps=新的int[size];
//第一个数据块的位移-0
对于(int i=0;i0)?(disps[i-1]+计数[i-1]):0;
//保存收集的数据的位置
//仅在根目录下分配
类型*alldata=NULL;
如果(秩==0)
//disps[size-1]+计数[size-1]==元素总数
alldata=新整数[disps[size-1]+计数[size-1]];
//把一切都收集到根里
MPI_Gatherv(矢量数据、元素、数据类型、,
所有数据、计数、显示、数据类型、0、MPI\u通信世界);
您还应该为结构注册MPI派生的数据类型(
上述代码中的数据类型
)(二进制发送将起作用,但不可移植,并且在异构设置中不起作用)。请发布代码。另外,请查看MPI\u GATHERV()
,正如我所说,您可以尝试使用GATHERV。有了这个,每台机器都可以发送自己长度的向量。使用recvcounts
完成此操作。感谢MPI\u Gatherv()工作正常!