如何使用mpi散射修复“矢量下标超出范围”?

问题描述 投票:0回答:2

问题在于我对MPI包装器如何工作的误解。我正在使用Microsoft MPI实现。在这段代码中,我试图将std::vector分散到进程,但得到调试断言vector subscript out of range错误。

这段代码是我使用boost包装器和Microsoft MPI实现hypersort算法的引导程序。

我尝试了来自boost库的示例,但得到了相同的断言。此外,我试图包括<vector><boost/serialization/vector>,但它没有帮助。我使用boost 1.70和最新版本的Microsoft MPI在Windows 10上运行我的程序。

#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版本中生成此错误

c++ boost mpi boost-mpi
2个回答
1
投票

您只能在调试版本中获得该错误,因为Microsoft编译器仅在调试版本中包含该检查。 Release版本中仍存在此问题。

如果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时将为空。


-1
投票

正确的方法是使用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);
© www.soinside.com 2019 - 2024. All rights reserved.