我正在尝试测量X86-64上的TLB(翻译后备缓冲区)未命中率。具体来说,第二级统一TLB的未命中罚款是TLB步行的费用。
我一直在研究Intel pcm工具,但无法弄清楚如何为此目的使用它。以下是我用来通过PCM库获取性能计数器的代码:
#include "cpucounters.h" // Intell PCM monitoring tool
int main() {
PCM * m = PCM::getInstance();
PCM::ErrorCode returnResult = m->program();
if (returnResult != PCM::Success){
std::cerr << "Intel's PCM couldn't start" << std::endl;
std::cerr << "Error code: " << returnResult << std::endl;
exit(1);
}
SystemCounterState before_sstate = getSystemCounterState();
// CODE TO MEASURE TLB MISS PENALTY
SystemCounterState after_sstate = getSystemCounterState();
std::cout << "Instructions per clock:" << getIPC(before_sstate,after_sstate) << std::endl;
std::cout << "Bytes read:" << getBytesReadFromMC(before_sstate,after_sstate) ;
}
这样我就可以获得IPC。但是我不知道测试程序的外观如何,以便高精度地测量TLB错过罚分。
关于可以用来快速估算的其他工具的任何提示都将非常有帮助。
[我在intel-pcm的官方网站上看到一个帖子,它说PCM由于其实现机制而无法添加TLB遗漏之类的指标:
PCM使用自由运行的计数器,即,在启动时会使用一组固定的事件对计数器进行一次编程。 PCM已经使用了所有可用的核心计数器,我们不能在不放弃其他指标(例如缓存未命中)的情况下添加任何其他指标(例如TLB未命中)。