mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-27 08:20:12 +01:00
aco/spill: Prefer unordered_map over map for next use distances
This changes the iteration order of next use distances, so some "random" changes to shader metrics are expected. fossil-db for Navi14: Totals from 1239 (0.82% of 150305) affected shaders: SpillSGPRs: 10559 -> 10562 (+0.03%); split: -0.05%, +0.08% SpillVGPRs: 1632 -> 1863 (+14.15%) CodeSize: 19321468 -> 19304164 (-0.09%); split: -0.09%, +0.01% Instrs: 3593957 -> 3591647 (-0.06%); split: -0.07%, +0.01% Latency: 103120695 -> 102475647 (-0.63%); split: -0.63%, +0.01% InvThroughput: 23897614 -> 23575320 (-1.35%); split: -1.36%, +0.02% VClause: 66406 -> 66943 (+0.81%); split: -0.01%, +0.81% SClause: 118559 -> 118548 (-0.01%) Copies: 310871 -> 308950 (-0.62%); split: -0.69%, +0.08% Branches: 123386 -> 123413 (+0.02%); split: -0.00%, +0.03% These numbers mostly come from parallel-rdp ubershaders. Small changes are also found in the rdr2 and rage2 shader metrics, whereas others are not significantly affected. Reviewed-by: Daniel Schürmann <daniel@schuermann.dev> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11925>
This commit is contained in:
parent
4453bce770
commit
6650799ea5
1 changed files with 18 additions and 4 deletions
|
|
@ -29,12 +29,25 @@
|
|||
#include "common/sid.h"
|
||||
|
||||
#include <algorithm>
|
||||
#include <cstring>
|
||||
#include <map>
|
||||
#include <set>
|
||||
#include <stack>
|
||||
#include <unordered_map>
|
||||
#include <unordered_set>
|
||||
#include <vector>
|
||||
|
||||
namespace std {
|
||||
template <> struct hash<aco::Temp> {
|
||||
size_t operator()(aco::Temp temp) const noexcept
|
||||
{
|
||||
uint32_t v;
|
||||
std::memcpy(&v, &temp, sizeof(temp));
|
||||
return std::hash<uint32_t>{}(v);
|
||||
}
|
||||
};
|
||||
} // namespace std
|
||||
|
||||
/*
|
||||
* Implements the spilling algorithm on SSA-form from
|
||||
* "Register Spilling and Live-Range Splitting for SSA-Form Programs"
|
||||
|
|
@ -59,8 +72,8 @@ struct spill_ctx {
|
|||
|
||||
std::vector<bool> processed;
|
||||
std::stack<Block*, std::vector<Block*>> loop_header;
|
||||
std::vector<std::map<Temp, std::pair<uint32_t, uint32_t>>> next_use_distances_start;
|
||||
std::vector<std::map<Temp, std::pair<uint32_t, uint32_t>>> next_use_distances_end;
|
||||
std::vector<std::unordered_map<Temp, std::pair<uint32_t, uint32_t>>> next_use_distances_start;
|
||||
std::vector<std::unordered_map<Temp, std::pair<uint32_t, uint32_t>>> next_use_distances_end;
|
||||
std::vector<std::vector<std::pair<Temp, uint32_t>>> local_next_use_distance; /* Working buffer */
|
||||
std::vector<std::pair<RegClass, std::unordered_set<uint32_t>>> interferences;
|
||||
std::vector<std::vector<uint32_t>> affinities;
|
||||
|
|
@ -158,11 +171,12 @@ void
|
|||
next_uses_per_block(spill_ctx& ctx, unsigned block_idx, std::set<uint32_t>& worklist)
|
||||
{
|
||||
Block* block = &ctx.program->blocks[block_idx];
|
||||
std::map<Temp, std::pair<uint32_t, uint32_t>> next_uses = ctx.next_use_distances_end[block_idx];
|
||||
std::unordered_map<Temp, std::pair<uint32_t, uint32_t>> next_uses =
|
||||
ctx.next_use_distances_end[block_idx];
|
||||
|
||||
/* to compute the next use distance at the beginning of the block, we have to add the block's
|
||||
* size */
|
||||
for (std::map<Temp, std::pair<uint32_t, uint32_t>>::iterator it = next_uses.begin();
|
||||
for (std::unordered_map<Temp, std::pair<uint32_t, uint32_t>>::iterator it = next_uses.begin();
|
||||
it != next_uses.end(); ++it)
|
||||
it->second.second = it->second.second + block->instructions.size();
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue