use*_*710 15 c++ intrinsics cpuid
考虑到我用C++编写代码,如果可能的话,我想使用类似内在函数的解决方案来阅读有关硬件的有用信息,我的顾虑/注意事项是:
我要回答的最后一个问题是:如何用内在函数做类似的事情?因为我没有找到除CPUID操作码以外的任何东西来获取这种信息.
use*_*710 12
经过一番挖掘后,我发现了一个有用的内置函数,它们是特定于gcc的.
唯一的问题是这种功能真的有限(基本上你只有2个功能,1个用于CPU"名称",1个用于寄存器组)
一个例子是
#include <stdio.h>
int main()
{
if (__builtin_cpu_supports("mmx")) {
printf("\nI got MMX !\n");
} else
printf("\nWhat ? MMX ? What is that ?\n");
return (0);
}
Run Code Online (Sandbox Code Playgroud)
显然这个内置函数也可以在mingw-w64下工作.
Gcc包含一个cpuid接口:
http://gcc.gnu.org/git/?p=gcc.git;a=blob;f=gcc/config/i386/cpuid.h
这些似乎没有很好的文档,但可以在这里找到示例用法:
http://gcc.gnu.org/git/?p=gcc.git;a=blob_plain;f=gcc/config/i386/driver-i386.c
请注意,必须使用__cpuid_count()而不是__cpuid()在ecx的初始值很重要时,例如使用avx/avx2检测.
正如user2485710指出的那样,gcc可以为你做所有的cpu功能检测工作.从gcc 4.8.1开始,__ builtin_cpu_supports()支持的完整功能列表是:cmov,mmx,popcnt,sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx和avx2.
像这样的内在函数通常也是编译器特定的.
MS VC++有__cpuid(和a __cpuidex)生成CPUID操作码.
至少据我所知,gcc/g ++并没有提供相同的功能.内联汇编似乎是唯一可用的选项.
对于 x86/x64,英特尔提供了一个名为_may_i_use_cpu_feature. 您可以在Intel Intrinsics Guide页面的General Support类别下找到它。以下是英特尔文档的翻录。
GCC 应该在内部函数方面遵循 Intel,因此它应该在 GCC 下可用。我不清楚微软是否提供它,因为他们提供了大多数(但不是全部)英特尔内在函数。
我对 ARM 一无所知。据我所知,没有__builtin_cpu_supports("neon"),__builtin_cpu_supports("crc32"),__builtin_cpu_supports("aes"),__builtin_cpu_supports("pmull"),__builtin_cpu_supports("sha"),ARM下等。对于 ARM,您必须执行CPU 功能探测。
Synopsis
int _may_i_use_cpu_feature (unsigned __int64 a)
#include "immintrin.h"
Description
Dynamically query the processor to determine if the processor-specific feature(s) specified
in a are available, and return true or false (1 or 0) if the set of features is
available. Multiple features may be OR'd together. This intrinsic does not check the
processor vendor. See the valid feature flags below:
Operation
_FEATURE_GENERIC_IA32
_FEATURE_FPU
_FEATURE_CMOV
_FEATURE_MMX
_FEATURE_FXSAVE
_FEATURE_SSE
_FEATURE_SSE2
_FEATURE_SSE3
_FEATURE_SSSE3
_FEATURE_SSE4_1
_FEATURE_SSE4_2
_FEATURE_MOVBE
_FEATURE_POPCNT
_FEATURE_PCLMULQDQ
_FEATURE_AES
_FEATURE_F16C
_FEATURE_AVX
_FEATURE_RDRND
_FEATURE_FMA
_FEATURE_BMI
_FEATURE_LZCNT
_FEATURE_HLE
_FEATURE_RTM
_FEATURE_AVX2
_FEATURE_KNCNI
_FEATURE_AVX512F
_FEATURE_ADX
_FEATURE_RDSEED
_FEATURE_AVX512ER
_FEATURE_AVX512PF
_FEATURE_AVX512CD
_FEATURE_SHA
_FEATURE_MPX
Run Code Online (Sandbox Code Playgroud)
对于曾孙,这是如何使用 GCC 获取 CPU 供应商名称,在 Win7 x64 上测试
#include <cpuid.h>
...
int eax, ebx, ecx, edx;
char vendor[13];
__cpuid(0, eax, ebx, ecx, edx);
memcpy(vendor, &ebx, 4);
memcpy(vendor + 4, &edx, 4);
memcpy(vendor + 8, &ecx, 4);
vendor[12] = '\0';
printf("CPU: %s\n", vendor);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7205 次 |
| 最近记录: |