Сообщения MPI искажены на некоторых процессорах

Часть моего кода разбивает сетку конечных элементов, которая изначально существует полностью в процессе 0, и отправляет ее части другим процессорам. Это включает в себя отправку списков идентификаторов узлов среди других данных другим процессорам. Мой код выглядит примерно так:

std::vector<std::vector<unsigned int> > id_send_lists(nproc);
// Fill in the id lists with correct ids here...

if (rank==0){
MPI_Request reqs[nproc-1];
for (int p=1; p<nproc; ++p){
MPI_Isend(node_id_lists[p].data(), node_id_lists[p].size(), MPI_UNSIGNED, p, 0, _communicator, &reqs[p-1]);
}
MPI_Waitall(nproc-1, reqs.data(), MPI_STATUSES_IGNORE);
}
else{
MPI_Status status;
int count;
std::vector<unsigned int> id_recv_vec;
MPI_Probe(0, 0, MPI_COMM_WORLD, &status);
MPI_GetCount(&status, MPU_UNSIGNED, &count);
id_recv_vec.resize(count);
MPI_Recv(id_recv_vec.data(), count, MPI_UNSIGNED, 0, 0, MPI_COMM_WORLD, &status);
// Parse the id vector and create nodes here...
}

Однако по какой-то причине мои сообщения иногда оказываются искаженными по пути, в зависимости от того, какой процессор приема я смотрю, и на скольких процессорах я работаю. Например, мой код, кажется, прекрасно работает при работе на процессорах с 1 по 5, но когда я запускаю на 6 процессорах, сообщения, отправляемые процессору 3, искажаются где-то по пути, и получаются только случайные целые числа. Полученные сообщения на процессорах 1, 2, 4 и 5, однако, в порядке. Кроме того, я проверил идентификаторы до того, как они были отправлены на процессор 0, и они оказались там в порядке.

Как ни странно, он снова работает нормально на 7 процессорах, а затем на 8 или более процессорах всегда есть хотя бы один процессор, который получает искаженные сообщения.

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector