如何使用MPI散点修复“向量下标超出范围”?

时间:2019-04-21 11:17:33

标签: c++ boost mpi boost-mpi

我对Boost MPI包装器的工作方式存在误解。 我正在使用Microsoft MPI实现。 在这段代码中,我试图将std::vector分散到进程中,但会收到调试声明vector subscript out of range错误。

这段代码是我的引导程序,用于使用Boost包装器和Microsoft MPI实现超排序算法。

我尝试了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 build中产生此错误

2 个答案:

答案 0 :(得分:1)

您只能在调试版本中得到该错误,因为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时将为空。

答案 1 :(得分:-1)

正确的方法是使用std :: vector :: data()获取第一个元素的地址。 可能仅是针对Microsoft MPI实施。

不增加调试断言的示例: mpiexec -n 4

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js">
</script>

<input id="fileup" name="fileup" type="file" style="display:none" >

<div id="container"class="container">
</div>

<template id='demoTemplate'>
   <span>
      <div class="btn-group">
         <button type="button" class="js-zoom-in" onclick="zoom_in(this)">Zoom In</button>
         <button type="button" class="js-zoom-out" onclick="zoom_out(this)">Zoom Out</button>
      </div>
      <img id="image" src ="" style ="display:none">
   </span>
</template>