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:

我有一个存储结构向量的应用程序。这些结构保存关于系统上每个GPU的信息,如内存和千兆次/秒。每个系统上有不同数量的GPU

我有一个同时在多台机器上运行的程序,我需要收集这些数据。我对MPI非常陌生,但大部分情况下都能使用
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()工作正常!