此程序显示当前核心执行的实际CPU核心周期计数(使用相关PMC,我认为是UNHALTED_CORE_CYCLES)
#include <unistd.h>
#include <cstdio>
int main(int argc, char* argv[]){
unsigned long a, d, c, result;
c = (1UL<<30)+1;
__asm__ volatile("rdpmc" : "=a" (a), "=d" (d) : "c" (c));
result = (a | (d << 32));
printf("Current cycles : %lu\n", result);
}
它在英特尔处理器上运行良好,但在AMD处理器(7001和7002)上显示“分段故障”。我的第一个猜测是找到一个与CPU_CLOCKS_UNHALTED AMD事件(0x76)相关的新c
值,但暂时没有成功
- 我在情报方面没做什么特别的事。此PMC是否默认启用?
- 如何让它在AMD上工作?
- 我尝试使用wrmsr命令listed here启用计数器,但他们也立即给了我一个“分段错误”
- 我尝试了以下命令
echo 2 | sudo tee /sys/devices/cpu/rdpmc # enable RDPMC always, not just when a perf event is open
1条答案
按热度按时间h7wcgrx31#
数字是错误的,AMD使用不同的RDPMC值比英特尔。根据处理器的不同,
rdpmc
直接支持多个事件,请参阅AMD manual以了解更多信息(第rdpmc
节)。在您的情况下,堆芯循环数应为
0
。此代码适用于我计数
PERF_COUNT_HW_INSTRUCTIONS
在Ryzen 7950X上测试