Я хочу, чтобы рассеять ряд элементов в векторе типа структуры в течение ряда процессов с этим минимальным кодом(КОМП ++) MPI_Scatter производить неправильные результаты (логическая ошибка)
struct node
{
scale2 P;
scale2 V;
float M;
//
node(float M, float Px, float Py) // constructor
:P(Px,Py)
, V(0.f, 0.f)
, M(m)
{}
};
основной функцией
int main(int argc, char **argv){
std::vector<node> bodies;
std::vector<node> b;
int rank, size, ROOT =0;
long int pC;
MPI_Datatype MPI_NODE;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
//creating data type that represents node
//setup description of scale2 and float
// define and commit structure type
if(rank == ROOT){
// initialise bodies
pC = bodies.size();
cout <<pC << " nodes" << endl;
}
MPI_Bcast(&pC, 1, MPI_LONG, ROOT, MPI_COMM_WORLD);
MPI_Scatter(&bodies, pC/size, MPI_NODE, &b, pC/size, MPI_NODE, ROOT, MPI_COMM_WORLD);
cout << "rank "<<rank<<" has " <<b.size()<<" values of bodies"<<endl;
//other stuff
MPI_Finalize();
return 0;
}
выход Ищу (с 4-х процессов и размеров тел = 64)
rank 0 has 16 values of bodies
rank 1 has 16 values of bodies
rank 2 has 16 values of bodies
rank 3 has 16 values of bodies
выход я получаю
rank 0 has 64 values of bodies
rank 2 has 2818 values of bodies
rank 1 has 0 values of bodies
rank 3 has 11311978710794943764 values of bodies
Я уверен, что проблема заключается либо в MPI_Scatter
линии или линии под ним, т.е. способ b.size()
в настоящее время выводится в неправильном направлении. Я выдаю также может быть на пути vector<node> b
передано в MPI_scatter
Остальная часть кода работает отлично, так как я тестировал без этих двух строк. Если эта часть кода не является проблемой (в чем я сомневаюсь), то способ, которым я определяю тип данных MPI_NODE
, неверен, и в этом случае я отредактирую свой код, чтобы показать эту часть.
pC транслируется в каждом ранге, не означает, что «инициализирует» его для каждого ранга? –
, а также вы говорите, что я должен попробовать 'b.resize (pC/size)' вместо '& b' в' MPI_scatter() ' –
Ooops, я упустил трансляцию - да, эта часть в порядке. Вы должны 'b.resize (pC/sisze);', а затем 'MPI_Scatter (.... b.data() ...);' – Zulan