Я знаю, что подобные вопросы задавались здесь раньше, но я не могу найти ничего подходящего для моей конкретной проблемы.
У меня есть 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 попытаться этого добиться?