MPI_Gather с использованием настраиваемого MPI_Datatype - PullRequest
0 голосов
/ 21 июня 2020

Я знаю, что подобные вопросы задавались здесь раньше, но я не могу найти ничего подходящего для моей конкретной проблемы.

У меня есть 4 std :: vector, которые имеют одинаковую длину на данный узел, но длина может отличаться в зависимости от узла. Они имеют тип int, int, double, int. Я хочу, чтобы они были собраны узлом root за один вызов MPI, поэтому я прибег к использованию MPI_Datatype:

// #1 Create an array on the root node containing the sizes of the vectors on each node
int nodevecsizes[commsize] = {0};
int localvecsize = intvec1.size();
MPI_Gather(&localvecsize,1,MPI_INT,nodevecsizes,1,MPI_INT,0,comm);

// #2 Create MPI struct to merge our 4 vectors on each node
int nitems = 4;
int blocklengths[nitems]        = {vecsize};
MPI_Datatype types[nitems]      = {MPI_INT, MPI_INT, MPI_DOUBLE, MPI_INT};
MPI_Aint vectorPointers[nitems] = {&intvec1, &intvec2, &doublevec, &intvec3};
MPI_Datatype nodeData;
MPI_Type_create_struct(nitems, blocklengths,vectorPointers,types, &nodeData);
MPI_Type_commit(&nodeData);

Моя конечная цель - иметь 4 вектора типа int, int, double , int на узле root, содержащем объединенные векторы со всех узлов.

Проблема, с которой я столкнулся, заключается в том, что я не уверен, как сделать вызов MPI_Gatherv / MPI_Gather в этом сценарии в качестве структуры nodeData имеет фиксированную длину. Правильно ли я подхожу к этому и как go попытаться этого добиться?

...