我正在为一个类项目开发一个1位双模分支预测模拟器。我正在考虑为表使用unordered_map,但我需要能够设置大小,所以我在考虑使用对向量,table.reserve(tableSize)可能是一个很好的方法。
然而,这使得我只对线性搜索向量来查找非常慢的表条目。有谁知道我可以为这个应用程序实现哈希函数的方法吗?
对于那些不知道分支预测器表如何工作的人,密钥是PC地址0x12345678,值为T或NT(分支采用或不采用)。我还需要一种碰撞解决方法。如果采用分支,则将位(bool)设置为true,这将是下一个分支的预测。如果未采用下一个分支,则将该位设置为假或0.模拟器的目的是测量正确的预测与总分支以获得准确性并将其与其他方法进行比较。精度最高。因此,最终目标是使用PC的2个最低有效字节(通过屏蔽它们)来定义散列表中的位置以存储预测值0或1。
非常感谢任何帮助。
侧面说明:最大表格大小将是1024个条目,因此时间复杂度没有机会真正扩展到那么高,但任何优化都是值得的,因为我将进入比赛。
决定使用unordered_map。
这是我到目前为止所获得的解决方案:
// bimodal 1-bit
class BM1Pred{
private:
std::ofstream &outputFile;
//hash table with bool value mapped to addresses
// 0 - NOT TAKEN, 1- TAKEN
unordered_map<long long, bool> table;
int tableSize;
public:
// constructor
BM1Pred(std::ofstream& file, int size)
: outputFile(file), tableSize(size) {}
// deconstructor
~BM1Pred()
{}
// member functions
void parseResults(std::string filename);
};
答案 0 :(得分:1)
您仍然可以使用std::unordered_map
。如果您想保留特定尺寸,可以使用std::unordered_map::reserve。
但我不明白为什么std::map
不能成为一种选择。它的大小动态变化。为什么你需要设置它的大小&#34;?
要回答您的其他问题,在map[key]
这两种情况下都会返回对映射到等效于key
的键的值的引用,如果此类键尚不存在则执行插入。因此,您可以通过
map[key] = value;
在这种情况下,如果容器中已存在key
,则value
存储的值会更新为key
;否则,执行插入。你自己不需要检查任何东西。
答案 1 :(得分:0)
我建议使用地图容器和[]
运算符。查看此在线参考,了解更多map
效果详情(例如红黑树):Big-O Cheatsheet。查看std::map和class template std::map了解属性,成员函数,迭代器等详细信息。据我所知,地图容器在C ++ 11中实现为红黑树。我知道早在90年代末,它肯定是作为一棵红黑树实现的。请注意,默认情况下排序将从低到高(例如less<Key>
)。