Ниже приведен код:
template<int N>
void para_sort(std::vector<bfs_node<N>>& res) {
#pragma omp parallel
{
boost::sort::block_indirect_sort(res.begin(), res.end(), compare_node<N>);
}
}
Код выполняется без каких-либо исключений при работе только с одним потоком OMP.Тем не менее, код создает исключение при работе с несколькими потоками.
Код отлично работает с несколькими потоками, когда используется Boost::Parallel_stable_sort
.
Я подозревал, что это будет строгое требование слабого порядка, чтоЭто вызвало исключение.Но в этом случае он должен быть увеличен с parallel_stable_sort
и std::sort
(последовательная версия).
Требует ли boost::block_indirect_sort
более строгого или более слабого ограничения порядка?
template<int N>
bool compare_node(const bfs_node<N>& lhs, const bfs_node<N>& rhs) {
if (lhs.id == rhs.id) return false;
for (int i = 0; i < N * 64; ++i) {
bool lflag = in_set(lhs.id, i);
bool rflag = in_set(rhs.id, i);
if (lflag == rflag ) { continue; }
if (lflag) return true;
return false;
}
return false;
} //
где *Поле 1017 * здесь представляет структуру данных типа unordered_set
.Например, id
представляет набор {1,2,3}
, а in_set(id, 1)
вернет true
, а в противном случае false
Возникло исключение: Invalid read of size 16
==2125== at 0x46C59F: void boost::sort::pdqsort_detail::pdqsort_loop<__gnu_cxx::__normal_iterator<bfs_node<1>*, std::vector<bfs_node<1>, std::allocator<bfs_node<1> > > >, std::less<bfs_node<1> >, false>(__gnu_cxx::__normal_iterator<bfs_node<1>*, std::vector<bfs_node<1>, std::allocator<bfs_node<1> > > >, __gnu_cxx::__normal_iterator<bfs_node<1>*, std::vector<bfs_node<1>, std::allocator<bfs_node<1> > > >, std::less<bfs_node<1> >, int, bool)