支持RDTSCP的gcc cpu类型是什么?

支持RDTSCP的gcc cpu类型是什么?,gcc,x86,intel,rdtsc,Gcc,X86,Intel,Rdtsc,我用RDTSCP来代替LFENCE;RDTSC序列,并返回处理器ID,以便在线程被重新调度到另一个CPU后,我知道何时比较TSC值 为了确保我不会在太旧的机器上运行RDTSCP,我会在CPUID检查(使用libcpuid)后返回RDTSC。我想尝试使用gcc多目标属性功能,而不是CPUID调用: int core2_func (void) __attribute__ ((__target__ ("arch=core2"))); (哈斯韦尔,天湖,…)。我如何找到哪个cpu系列最先引入RDTSC

我用RDTSCP来代替LFENCE;RDTSC序列,并返回处理器ID,以便在线程被重新调度到另一个CPU后,我知道何时比较TSC值

为了确保我不会在太旧的机器上运行RDTSCP,我会在CPUID检查(使用libcpuid)后返回RDTSC。我想尝试使用gcc多目标属性功能,而不是CPUID调用:

int core2_func (void) __attribute__ ((__target__ ("arch=core2")));
(哈斯韦尔,天湖,…)。我如何找到哪个cpu系列最先引入RDTSCP?

根据2006年写的一篇文章,
RDTSCP
指令最先引入AMD NPT系列0Fh处理器,现在称为。然而,有许多处理器属于这个系列,并且是在2006年或之前发布的。我找到了另一本,最初是用日语写的,但我用谷歌翻译把它翻译成英语。那篇文章提到0Fh系列的“Rev.F”支持
RDTSCP
指令。所有品牌为F版(包括F2和F3版)及更高版本的K8处理器都支持
RDTSCP
。较旧的K8处理器(包括一些双核处理器)不支持
RDTSCP

在英特尔处理器上,Nehalem和更高版本、Silvermont和更高版本以及Knights Landing和更高版本支持RDTSCP



脚注1:我只能使用回程机和。AMD网站上已经没有了。

英特尔的指令集手册(请参阅或参阅本手册)只告诉您要为每条指令检查哪一个CPUID功能位。(仅通过微体系结构记录p5中CPUID之前的事物)。为了找到什么CPU引入了什么指令,我通常会查看维基百科。但在这里没有用。如果存在CPUID转储,可以查看CPUID转储表,并检查功能位。当然,如果您在运行时实际在程序中运行CPUID指令,则只需检查指定的功能位。直接使用ifunc属性,您可以指定自己的解析器,特别是测试适当CPUID位的解析器,而不是依赖预定义的目标。看起来clang没有实现gcc目标属性(也没有实现Marc在评论中提到的ifunc属性),所以即使我知道要使用的arch设置正确,我也无法利用它。(文档没有提到多个目标,所以我不知道是否支持)(如果你使用Mac,对你来说太糟糕了)我在寻找重复的目标时发现了这个问题。这是关于HW拥有什么的好信息,但是如果你这样做的话,希望你能让GCC根据Marc Glisse建议的自定义CPUID位进行调度。但是它必须是自定义位,因为我认为GCC“不知道”那个特性位。它不会阻止您像为
-march=core2
或generic编译时那样使用
\uuuu内置ia32\uRDTSCP()
/
\uuuuuRDTSCP()
(或
rdpmc
)大多数其他内部函数。我不认为GCC“知道”哪个CPU支持它,而且绝对不定义任何带有
-march=native
和基线的宏。@PeterCordes是对的。我已经在那里发布了答案。