【发布时间】:2014-03-24 15:29:16
【问题描述】:
我正在为一个班级项目开发一个 1 位双峰分支预测模拟器。我正在考虑为表格使用 unordered_map,但我需要能够设置大小,所以我在考虑使用成对的向量,而 table.reserve(tableSize) 可能是这样做的好方法。
但是,这使我只能对向量进行线性搜索来查找非常慢的表条目。有谁知道我可以为此应用程序实现哈希函数的方法吗?
对于那些不知道分支预测器表如何工作的人,关键是 PC 地址 0x12345678,值是 T 或 NT(分支采用或未采用)。我还需要一种解决冲突的方法。如果采用一个分支,则该位 (bool) 设置为 true,这将是下一个分支的预测。如果不采用下一个分支,则该位设置为 false 或 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);
};
【问题讨论】:
-
你有没有想过使用
std::map?看起来很合适。 -
@VioletGiraffe 我可以设置它的大小吗?此外,地图最初必须为空。这些值将在程序执行过程中累积在其中。
-
您可以添加和删除元素,它是一个动态大小的容器。我不记得它是否有保留特定大小的方法,但即使没有 - 只需在循环中添加所需数量的元素并使用空白值初始化。
-
@VioletGiraffe 需要它覆盖地图元素 0-1023 之一,而不是添加另一个。如果我将其初始化为空白值,则不会添加另一个元素将表大小增加到 1025....1026...等等?
-
当然,但是
[]操作符的功能是,如果新的键值不存在,它将被创建。我正在发布一个答案供您参考。
标签: c++ vector hashtable std-pair