Есть ли ограничение на размер сообщения в mpi при использовании boost :: mpi?

В настоящее время я пишу симуляцию с использованием boost :: mpi поверх openMPI, и все прекрасно работает. Однако, когда я масштабирую систему и, следовательно, должен посылать большие std :: vectors, я получаю ошибки.

Я уменьшил проблему до следующей проблемы:

#include <boost/mpi.hpp>
#include <boost/mpi/environment.hpp>
#include <boost/mpi/communicator.hpp>
#include <boost/serialization/vector.hpp>
#include <iostream>
#include <vector>
namespace mpi = boost::mpi;

int main() {
mpi::environment env;
mpi::communicator world;

std::vector<char> a;
std::vector<char> b;
if (world.rank() == 0) {
for (size_t i = 1; i < 1E10; i *= 2) {
a.resize(i);
std::cout << "a " << a.size();
world.isend(0, 0, a);
world.recv(0, 0, b);
std::cout << "\tB " << b.size() << std::endl;
}
}
return 0;
}

распечатывает:

a 1 B 1
a 2 B 2
a 4 B 4
....
a 16384 B 16384
a 32768 B 32768
a 65536 B 65536
a 131072    B 0
a 262144    B 0
a 524288    B 0
a 1048576   B 0
a 2097152   B 0

Я знаю, что есть ограничение на размер сообщения в формате mpi, но 65 КБ мне кажется немного низким.
Есть ли способ отправки больших сообщений?

6

Решение

Предел размера сообщения такой же, как для MPI_Send: INT_MAX,

Проблема в том, что вы не ждете isend закончить перед изменением размера вектора a в следующей итерации. Это означает, что isend будет читать неверные данные из-за перераспределения в векторе a, Обратите внимание, что буфер a передается по ссылке на boost::mpi и вам не разрешено менять буфер a до isend операция закончена.

Если вы запустите свою программу с valgrind, вы увидите недопустимые чтения, как только я = 131072.

Причина, по которой ваша программа работает до 65536 байт, заключается в том, что OpenMPI будет отправлять сообщения напрямую, если они меньше, чем компоненты btl_eager_limit, Для self компонент (отправка в собственный процесс), это происходит 128*1024 байт. поскольку boost::serialization добавляет размер std::vector в поток байтов, вы превышаете это eager_limit как только вы используете 128*1024 = 131072 как ваш входной размер.

Чтобы исправить свой код, сохраните boost::mpi::request возвращаемое значение из isend() а затем добавить wait() до конца цикла:

#include <boost/mpi.hpp>
#include <boost/mpi/environment.hpp>
#include <boost/mpi/communicator.hpp>
#include <boost/serialization/vector.hpp>
#include <iostream>
#include <vector>
namespace mpi = boost::mpi;

int main() {
mpi::environment env;
mpi::communicator world;

std::vector<char> a;
std::vector<char> b;
if (world.rank() == 0) {
for (size_t i = 1; i < 1E9; i *= 2) {
a.resize(i);
std::cout << "a " << a.size();
mpi::request req = world.isend(0, 0, a);
world.recv(0, 0, b);
std::cout << "\tB " << b.size() << std::endl;
req.wait();
}
}
return 0;
}
3

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


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