如何使用 mpi 散点图修复 "vector subscript out of range"?
How to fix "vector subscript out of range" using mpi scatter?
问题出在我对 boost MPI 包装器工作原理的误解上。
我正在使用 Microsoft MPI 实现。
在此代码中,我试图将 std::vector
分散到进程中,但得到调试断言 vector subscript out of range
错误。
此代码是我 bootstrap 使用 boost 包装器和 Microsoft MPI 实现超排序算法的代码。
我尝试了 boost 库中的示例,但得到了相同的断言。
我也尝试同时包含 <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算法的顺序实现
我希望 communicator 中的所有进程都有自己的未排序列表。
我只能在调试版本中产生这个错误
您只会在调试版本中遇到该错误,因为 Microsoft 编译器仅在调试版本中包含该检查。问题仍然存在于发布版本中。
如果 world.rank()
为零,当您在 unsorted_dist_list[j]
中使用 unsorted_dist_list
时,它会是一个空向量。至少,您应该添加
unsorted_dist_list.resize(world.size());
在 for (size_t j = 0;
循环之前。
如果world.rank()
不为零,unsorted_dist_list
传递给mpi::scatter
时将为空。
正确的方法是使用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);
问题出在我对 boost MPI 包装器工作原理的误解上。
我正在使用 Microsoft MPI 实现。
在此代码中,我试图将 std::vector
分散到进程中,但得到调试断言 vector subscript out of range
错误。
此代码是我 bootstrap 使用 boost 包装器和 Microsoft MPI 实现超排序算法的代码。
我尝试了 boost 库中的示例,但得到了相同的断言。
我也尝试同时包含 <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算法的顺序实现
我希望 communicator 中的所有进程都有自己的未排序列表。
我只能在调试版本中产生这个错误
您只会在调试版本中遇到该错误,因为 Microsoft 编译器仅在调试版本中包含该检查。问题仍然存在于发布版本中。
如果 world.rank()
为零,当您在 unsorted_dist_list[j]
中使用 unsorted_dist_list
时,它会是一个空向量。至少,您应该添加
unsorted_dist_list.resize(world.size());
在 for (size_t j = 0;
循环之前。
如果world.rank()
不为零,unsorted_dist_list
传递给mpi::scatter
时将为空。
正确的方法是使用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);