Skip to content

Commit 1ed32ca

Browse files
litghostacomodi
authored andcommitted
Do not use unordered_map over flat rr node vector lookup.
Use of unordered_map consumes ~10% of routing time on designs with non-configurable edges. Signed-off-by: Keith Rothman <[email protected]>
1 parent 771be2c commit 1ed32ca

File tree

3 files changed

+10
-11
lines changed

3 files changed

+10
-11
lines changed

vpr/src/base/vpr_context.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ struct DeviceContext : public Context {
147147
std::vector<std::vector<int>> rr_non_config_node_sets;
148148

149149
//Reverse look-up from RR node to non-configurably connected node set (index into rr_nonconf_node_sets)
150-
std::unordered_map<int, int> rr_node_to_non_config_node_set;
150+
std::vector<int> rr_node_to_non_config_node_set;
151151

152152
//The indicies of rr nodes of a given type at a specific x,y grid location
153153
t_rr_node_indices rr_node_indices; //[0..NUM_RR_TYPES-1][0..grid.width()-1][0..grid.width()-1][0..size-1]

vpr/src/route/route_common.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -723,9 +723,9 @@ float get_rr_cong_cost(int inode) {
723723

724724
float cost = get_single_rr_cong_cost(inode);
725725

726-
auto itr = device_ctx.rr_node_to_non_config_node_set.find(inode);
727-
if (itr != device_ctx.rr_node_to_non_config_node_set.end()) {
728-
for (int node : device_ctx.rr_non_config_node_sets[itr->second]) {
726+
int node_set = device_ctx.rr_node_to_non_config_node_set[inode];
727+
if (node_set != -1) {
728+
for (int node : device_ctx.rr_non_config_node_sets[node_set]) {
729729
if (node != inode) {
730730
continue; //Already included above
731731
}

vpr/src/route/rr_graph.cpp

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3113,20 +3113,19 @@ static void expand_non_configurable(int inode, std::set<t_node_edge>& edge_set)
31133113
}
31143114

31153115
static void process_non_config_sets(const t_non_configurable_rr_sets& non_config_rr_sets) {
3116-
std::vector<std::vector<int>> non_config_rr_node_sets;
3117-
std::unordered_map<int, int> rr_node_non_config_node_set;
3116+
auto& device_ctx = g_vpr_ctx.mutable_device();
3117+
3118+
std::vector<std::vector<int>>& non_config_rr_node_sets = device_ctx.rr_non_config_node_sets;
3119+
std::vector<int>& rr_node_non_config_node_set = device_ctx.rr_node_to_non_config_node_set;
3120+
rr_node_non_config_node_set.resize(device_ctx.rr_nodes.size(), -1);
31183121

31193122
for (const auto& node_set : non_config_rr_sets.node_sets) {
31203123
//Convert node sets to vectors
31213124
non_config_rr_node_sets.push_back(std::vector<int>(node_set.begin(), node_set.end()));
31223125

31233126
//Record reverse look-ups
31243127
for (int inode : node_set) {
3125-
rr_node_non_config_node_set.emplace(inode, non_config_rr_node_sets.size() - 1);
3128+
rr_node_non_config_node_set[inode] = non_config_rr_node_sets.size() - 1;
31263129
}
31273130
}
3128-
3129-
auto& device_ctx = g_vpr_ctx.mutable_device();
3130-
device_ctx.rr_non_config_node_sets = std::move(non_config_rr_node_sets);
3131-
device_ctx.rr_node_to_non_config_node_set = std::move(rr_node_non_config_node_set);
31323131
}

0 commit comments

Comments
 (0)