From dc8e6bd8d91ffeafbcd0d4710f5d8510ba32661d Mon Sep 17 00:00:00 2001 From: Moritz Kobitzsch Date: Mon, 12 Dec 2016 16:14:35 +0100 Subject: [PATCH] use correct type in graph contractor to avoid overflows in nodes --- include/contractor/graph_contractor.hpp | 97 +++++++++++++------------ 1 file changed, 50 insertions(+), 47 deletions(-) diff --git a/include/contractor/graph_contractor.hpp b/include/contractor/graph_contractor.hpp index 0b831be9f..f47c1277d 100644 --- a/include/contractor/graph_contractor.hpp +++ b/include/contractor/graph_contractor.hpp @@ -278,9 +278,9 @@ class GraphContractor std::vector remaining_nodes(number_of_nodes); // initialize priorities in parallel - tbb::parallel_for(tbb::blocked_range(0, number_of_nodes, InitGrainSize), - [this, &remaining_nodes](const tbb::blocked_range &range) { - for (int x = range.begin(), end = range.end(); x != end; ++x) + tbb::parallel_for(tbb::blocked_range(0, number_of_nodes, InitGrainSize), + [this, &remaining_nodes](const tbb::blocked_range &range) { + for (auto x = range.begin(), end = range.end(); x != end; ++x) { remaining_nodes[x].id = x; } @@ -302,16 +302,16 @@ class GraphContractor util::UnbufferedLog log; log << "initializing elimination PQ ..."; - tbb::parallel_for(tbb::blocked_range(0, number_of_nodes, PQGrainSize), - [this, &node_priorities, &node_depth, &thread_data_list]( - const tbb::blocked_range &range) { - ContractorThreadData *data = thread_data_list.GetThreadData(); - for (int x = range.begin(), end = range.end(); x != end; ++x) - { - node_priorities[x] = - this->EvaluateNodePriority(data, node_depth[x], x); - } - }); + tbb::parallel_for( + tbb::blocked_range(0, number_of_nodes, PQGrainSize), + [this, &node_priorities, &node_depth, &thread_data_list]( + const tbb::blocked_range &range) { + ContractorThreadData *data = thread_data_list.GetThreadData(); + for (auto x = range.begin(), end = range.end(); x != end; ++x) + { + node_priorities[x] = this->EvaluateNodePriority(data, node_depth[x], x); + } + }); log << "ok"; } BOOST_ASSERT(node_priorities.size() == number_of_nodes); @@ -429,9 +429,9 @@ class GraphContractor } tbb::parallel_for( - tbb::blocked_range(0, remaining_nodes.size(), IndependentGrainSize), + tbb::blocked_range(0, remaining_nodes.size(), IndependentGrainSize), [this, &node_priorities, &remaining_nodes, &thread_data_list]( - const tbb::blocked_range &range) { + const tbb::blocked_range &range) { ContractorThreadData *data = thread_data_list.GetThreadData(); // determine independent node set for (auto i = range.begin(), end = range.end(); i != end; ++i) @@ -455,13 +455,13 @@ class GraphContractor { // write out contraction level tbb::parallel_for( - tbb::blocked_range( + tbb::blocked_range( begin_independent_nodes_idx, end_independent_nodes_idx, ContractGrainSize), [this, remaining_nodes, flushed_contractor, current_level]( - const tbb::blocked_range &range) { + const tbb::blocked_range &range) { if (flushed_contractor) { - for (int position = range.begin(), end = range.end(); position != end; + for (auto position = range.begin(), end = range.end(); position != end; ++position) { const NodeID x = remaining_nodes[position].id; @@ -470,7 +470,7 @@ class GraphContractor } else { - for (int position = range.begin(), end = range.end(); position != end; + for (auto position = range.begin(), end = range.end(); position != end; ++position) { const NodeID x = remaining_nodes[position].id; @@ -482,12 +482,12 @@ class GraphContractor // contract independent nodes tbb::parallel_for( - tbb::blocked_range( + tbb::blocked_range( begin_independent_nodes_idx, end_independent_nodes_idx, ContractGrainSize), [this, &remaining_nodes, &thread_data_list]( - const tbb::blocked_range &range) { + const tbb::blocked_range &range) { ContractorThreadData *data = thread_data_list.GetThreadData(); - for (int position = range.begin(), end = range.end(); position != end; + for (auto position = range.begin(), end = range.end(); position != end; ++position) { const NodeID x = remaining_nodes[position].id; @@ -496,11 +496,12 @@ class GraphContractor }); tbb::parallel_for( - tbb::blocked_range( + tbb::blocked_range( begin_independent_nodes_idx, end_independent_nodes_idx, DeleteGrainSize), - [this, &remaining_nodes, &thread_data_list](const tbb::blocked_range &range) { + [this, &remaining_nodes, &thread_data_list]( + const tbb::blocked_range &range) { ContractorThreadData *data = thread_data_list.GetThreadData(); - for (int position = range.begin(), end = range.end(); position != end; + for (auto position = range.begin(), end = range.end(); position != end; ++position) { const NodeID x = remaining_nodes[position].id; @@ -545,13 +546,14 @@ class GraphContractor if (!use_cached_node_priorities) { tbb::parallel_for( - tbb::blocked_range(begin_independent_nodes_idx, - end_independent_nodes_idx, - NeighboursGrainSize), + tbb::blocked_range(begin_independent_nodes_idx, + end_independent_nodes_idx, + NeighboursGrainSize), [this, &node_priorities, &remaining_nodes, &node_depth, &thread_data_list]( - const tbb::blocked_range &range) { + const tbb::blocked_range &range) { ContractorThreadData *data = thread_data_list.GetThreadData(); - for (int position = range.begin(), end = range.end(); position != end; + for (auto position = range.begin(), end = range.end(); + position != end; ++position) { NodeID x = remaining_nodes[position].id; @@ -572,26 +574,27 @@ class GraphContractor { if (orig_node_id_from_new_node_id_map.size() > 0) { - tbb::parallel_for(tbb::blocked_range(0, remaining_nodes.size(), InitGrainSize), - [this, &remaining_nodes](const tbb::blocked_range &range) { - for (int x = range.begin(), end = range.end(); x != end; ++x) - { - const auto orig_id = remaining_nodes[x].id; - is_core_node[orig_node_id_from_new_node_id_map[orig_id]] = - true; - } - }); + tbb::parallel_for( + tbb::blocked_range(0, remaining_nodes.size(), InitGrainSize), + [this, &remaining_nodes](const tbb::blocked_range &range) { + for (auto x = range.begin(), end = range.end(); x != end; ++x) + { + const auto orig_id = remaining_nodes[x].id; + is_core_node[orig_node_id_from_new_node_id_map[orig_id]] = true; + } + }); } else { - tbb::parallel_for(tbb::blocked_range(0, remaining_nodes.size(), InitGrainSize), - [this, &remaining_nodes](const tbb::blocked_range &range) { - for (int x = range.begin(), end = range.end(); x != end; ++x) - { - const auto orig_id = remaining_nodes[x].id; - is_core_node[orig_id] = true; - } - }); + tbb::parallel_for( + tbb::blocked_range(0, remaining_nodes.size(), InitGrainSize), + [this, &remaining_nodes](const tbb::blocked_range &range) { + for (auto x = range.begin(), end = range.end(); x != end; ++x) + { + const auto orig_id = remaining_nodes[x].id; + is_core_node[orig_id] = true; + } + }); } } else