gpt4 book ai didi

c++ - 在编译时检测处理器是否有 RDTSCP

转载 作者:IT王子 更新时间:2023-10-29 00:58:49 31 4
gpt4 key购买 nike

一些新的 Intel 处理器同时具有 RDTSCRDTSCP 指令,而大多数旧处理器只有 RDTSC 指令。

在使用 C/C++ 编写代码时,如何在编译时检测正在使用的体系结构是否具有 RDTSCP 指令?

我知道我们可以通过浏览 CPU 信息(例如,cat/proc/cpuinfo)然后调整我们的代码来手动检查这一点。但是在编译时获取此信息(作为宏或标志值)将真正省去手动检查和编辑代码的需要。

最佳答案

GCC 定义了许多宏来在编译时确定使用 -march 指定的微体系结构是否支持特定功能。您可以在源代码中找到完整列表 here .很明显,GCC 没有为 RDTSCP(甚至 RDTSC)定义这样的宏。支持 RDTSCP 的处理器列在:What is the gcc cpu-type that includes support for RDTSCP? .

因此,您可以创建自己的(可能不完整的)支持 RDTSCP 的微体系结构列表。然后编写一个构建脚本来检查传递给 -march 的参数并查看它是否在列表中。如果是,则定义一个宏,例如 __RDTSCP__ 并在您的代码中使用它。我认为即使您的列表不完整,也不应损害代码的正确性。

遗憾的是,Intel 数据表似乎没有具体说明特定处理器是否支持 RDTSCP,即使它们讨论了 AVX2 等其他功能。

这里的一个潜在问题是,无法保证每个实现特定微架构(例如 Skylake)的处理器都支持 RDTSCP。不过我不知道有这样的异常(exception)情况。

相关:What is the gcc cpu-type that includes support for RDTSCP? .


要在运行时确定 RDTSCP 支持,以下代码可用于任何 x86 操作系统上支持 GNU 扩展(GCC、clang、ICC)的编译器。 cpuid.h 是编译器自带的,不是操作系统。

#include <cpuid.h>

int rdtscp_supported(void) {
unsigned a, b, c, d;
if (__get_cpuid(0x80000001, &a, &b, &c, &d) && (d & (1<<27)))
{
// RDTSCP is supported.
return 1;
}
else
{
// RDTSCP is not supported.
return 0;
}
}

__get_cpuid() 运行 CPUID 两次:一次检查最大级别,一次使用指定的叶值。如果请求的级别甚至不可用,它会返回 false,这就是为什么它是 && 表达式的一部分的原因。您可能不想每次在 rdtscp 之前都使用它,只是作为变量的初始化器,除非它只是一个简单的一次性程序。看吧on the Godbolt compiler explorer .

对于 MSVC,请参阅 How to detect rdtscp support in Visual C++?对于使用其内在的代码。


对于 GCC 确实知道的一些 CPU 功能,您可以使用 __builtin_cpu_supports 检查在启动早期初始化的功能位图。

// unfortunately no equivalent for RDTSCP
int sse42_supported() {
return __builtin_cpu_supports("sse4.2");
}

关于c++ - 在编译时检测处理器是否有 RDTSCP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32357513/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com