gpt4 book ai didi

MPI 接收/收集动态矢量长度

转载 作者:行者123 更新时间:2023-12-04 18:11:55 27 4
gpt4 key购买 nike

我有一个存储结构向量的应用程序。这些结构保存有关系统上每个 GPU 的信息,如内存和 giga-flop/s。每个系统上有不同数量的 GPU。

我有一个程序可以同时在多台机器上运行,我需要收集这些数据。我对 MPI 很陌生,但可以使用 MPI_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;
};

集群中的每台机器都填充其 MachineData 的实例.我想收集这些实例中的每一个,但我不确定如何收集 nviVecamdVec因为它们的长度在每台机器上都不同。

最佳答案

您可以使用 MPI_GATHERV结合 MPI_GATHER来实现这一点。 MPI_GATHERVMPI_GATHER 的可变版本它允许根等级从每个发送进程收集不同数量的元素。但是为了让根等级指定这些数字,它必须知道每个等级包含多少个元素。这可以使用简单的单个元素来实现 MPI_GATHER在那之前。像这样的东西:

// To keep things simple: root is fixed to be rank 0 and MPI_COMM_WORLD is used

// Number of MPI processes and current rank
int size, rank;
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);

int *counts = new int[size];
int nelements = (int)vector.size();
// Each process tells the root how many elements it holds
MPI_Gather(&nelements, 1, MPI_INT, counts, 1, MPI_INT, 0, MPI_COMM_WORLD);

// Displacements in the receive buffer for MPI_GATHERV
int *disps = new int[size];
// Displacement for the first chunk of data - 0
for (int i = 0; i < size; i++)
disps[i] = (i > 0) ? (disps[i-1] + counts[i-1]) : 0;

// Place to hold the gathered data
// Allocate at root only
type *alldata = NULL;
if (rank == 0)
// disps[size-1]+counts[size-1] == total number of elements
alldata = new int[disps[size-1]+counts[size-1]];
// Collect everything into the root
MPI_Gatherv(vectordata, nelements, datatype,
alldata, counts, disps, datatype, 0, MPI_COMM_WORLD);

您还应该为结构注册 MPI 派生数据类型(上面代码中的 datatype)(二进制发送可以工作,但不能移植,也不能在异构设置中工作)。

关于MPI 接收/收集动态矢量长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12080845/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com