Как исправить «векторный индекс вне диапазона», используя MPI Scatter? - PullRequest
0 голосов
/ 21 апреля 2019

Проблема в том, что я неправильно понимаю, как работают надстройки MPI. Я использую реализацию Microsoft MPI. В этом коде я пытаюсь разбросать std::vector по процессам, но получаю отладочное утверждение vector subscript out of range error.

Этот код является моей начальной загрузкой для реализации алгоритма гиперсортировки с использованием надстроек надстройки и Microsoft MPI.

Я пробовал примеры из буст-библиотек, но получил то же утверждение. Также я попытался включить и <vector> и <boost/serialization/vector>, но это не помогло. Я запускаю свою программу в Windows 10, используя boost 1.70 и последнюю версию Microsoft MPI.

#pragma once

#include <boost/mpi.hpp>
#include <boost/mpi/collectives.hpp>
#include <boost/serialization/vector.hpp>

#include "qsort.hpp"
#include "utils.hpp"

namespace algo {
namespace mpi_extension {

namespace mpi = boost::mpi;

void hyperqsort_v1(int argc, char* argv[]) {
    mpi::environment env(argc, argv);
    mpi::communicator world;
    int value = 0;
    int recv_value = 0;

    std::vector<int> unsorted_list{5, 3, 6, 2, 9, 1, 10, 7};
    auto distribuion_number = unsorted_list.size() / world.size();
    std::vector<std::vector<int>> unsorted_dist_list;
    if(0 == world.rank()) {
        for(size_t j = 0; j < world.size(); ++j) {
            for(size_t k = 0 + j; k < distribuion_number + j; ++k) {
                unsorted_dist_list[j].push_back(unsorted_list[j + k]);
            }
        }

    }
    std::vector<int> recv_vector;
    recv_vector.resize(distribuion_number);
    mpi::scatter(
        world, unsorted_dist_list, recv_vector, 0);
}

} // namespace mpi_extension
} // namespace algo

qsort.hpp - последовательная реализация алгоритма qsort

Я ожидаю, что у всех процессов в коммуникаторе есть свой несортированный список.

Я могу выдать эту ошибку только в Debug build

Ответы [ 2 ]

1 голос
/ 21 апреля 2019

Эта ошибка появляется только в отладочных сборках, поскольку компилятор Microsoft включает эту проверку только в отладочных сборках.Проблема все еще существует в сборке выпуска.

Если world.rank() равен нулю, unsorted_dist_list будет пустым вектором при использовании его в unsorted_dist_list[j].Как минимум, вы должны добавить

unsorted_dist_list.resize(world.size());

перед циклом for (size_t j = 0;.

Если world.rank() не ноль, unsorted_dist_list будет пустым при передаче в mpi::scatter.

0 голосов
/ 29 апреля 2019

Правильный способ - использовать std :: vector :: data (), чтобы получить адрес первого элемента.Может быть, это только для реализации Microsoft MPI.

Пример без возрастающего отладочного утверждения: mpiexec -n 4

mpi::environment env;
mpi::communicator world;

std::vector<int> unsorted_list{11, 36, 44, 50, 53, 67, 86, 95};
std::vector<int> list;
list.resize(2);

mpi::scatter(world, unsorted_list.data(), list.data(), 2, 0);
...