【问题标题】:What is the gcc cpu-type that includes support for RDTSCP?包含对 RDTSCP 支持的 gcc cpu 类型是什么?
【发布时间】: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,那对你来说太糟糕了)

标签: gcc x86 intel rdtsc


【解决方案1】:

根据写于 2006 年的 this1 文章,RDTSCP 指令首次引入 AMD NPT 系列 0Fh 处理器,现在称为 AMD K8 Hammer。不过有很多处理器属于这个家族,并且是在2006年或之前发布的。我又找了一个article,原来是用日文写的,但是我用谷歌翻译把它翻译成英文。那篇文章提到Family 0Fh 的“Rev. F”支持RDTSCP 指令。所有标记为修订版 F(包括 F2 和 F3)及更高修订版的 K8 处理器都支持RDTSCP。较旧的 K8 处理器(包括一些双核处理器)不支持RDTSCP

在 Intel 处理器上,RDTSCP 在 Nehalem 及更高版本、Silvermont 及更高版本以及 Knights Landing 及更高版本上受支持。


脚注 1:我只能使用 Wayback Machine 和 here 找到这篇文章。 AMD 网站上已经没有它了。

【讨论】:

  • 我在寻找 Detect if processor has RDTSCP at compile time 的重复项时也发现了这个问题。这是关于硬件有什么的好信息,但如果你这样做,希望你可以让 GCC 根据 Marc Glisse 建议的自定义 CPUID 位进行调度。
  • 但它必须是自定义位,因为我认为 GCC 不“知道”该功能位。在为-march=core2 或泛型编译时,它不会阻止您像对大多数其他内在函数一样使用__builtin_ia32_rdtscp() / __rdtscp()(或rdpmc)。我不认为 GCC“知道”哪些 CPU 支持它,并且绝对没有定义任何带有 -march=native 与基线的宏。
  • @PeterCordes 对。我已经在那里发布了答案。
猜你喜欢
  • 2012-02-01
  • 2013-09-17
  • 2011-06-26
  • 1970-01-01
  • 1970-01-01
  • 2011-04-19
  • 2014-08-25
  • 1970-01-01
  • 2015-03-11
相关资源
最近更新 更多