【发布时间】:2016-10-07 13:36:37
【问题描述】:
我正在使用 RDTSCP 替换 LFENCE;RDTSC 序列,并获取处理器 ID,以便在线程重新调度到另一个 CPU 后我知道何时比较 TSC 值。
为了确保我不会在太旧的机器上运行 RDTSCP,我在 CPUID 检查后回退到 RDTSC(使用 libcpuid)。我想尝试使用 gcc 多目标属性功能而不是 CPUID 调用:
int core2_func (void) __attribute__ ((__target__ ("arch=core2")));
gcc manual lists a number of cpu families (haswell, skylake, ...)。如何找到首先引入 RDTSCP 的 cpu 系列?
【问题讨论】:
-
Intel 的指令集手册(请参阅x86 tag wiki 或此HTML extract)仅告诉您要检查每条指令的 CPUID 功能位。 (仅通过微架构记录 p5 中早于 CPUID 的事物)。要查找哪个 CPU 引入了什么指令,我通常会查看 Wikipedia。
-
不过,en.wikipedia.org/wiki/Time_Stamp_Counter 在这里没有用。如果存在 CPUID 转储表,则可以查看该表,并检查功能位。当然,如果你在运行时实际上是在你的程序中运行一条 CPUID 指令,你应该只检查指定的功能位。
-
直接使用 ifunc 属性,您可以指定自己的解析器,特别是测试适当的 cpuid 位的解析器,而不是依赖于预定义的目标。
-
看起来 clang 没有实现 gcc 目标属性(也没有实现 Marc 在他的评论中提到的 ifunc 属性),所以即使我知道使用正确的拱形设置。
-
clang.llvm.org/docs/AttributeReference.html#target-gnu-target(文档没有提到多个目标,所以我不知道是否支持)clang.llvm.org/docs/AttributeReference.html#ifunc-gnu-ifunc(如果你使用的是 Mac,那对你来说太糟糕了)