Подтвердить что ты не робот

Intrinsics для получения информации о CPUID?

Учитывая, что я кодирую на С++, если это возможно, я хотел бы использовать решение типа Intrinsics для чтения полезной информации об оборудовании, мои соображения/соображения:

  • Я не знаю сборки, что хорошо, это будет значительная инвестиция, просто чтобы получить такую ​​информацию (хотя это похоже на CPU, это просто перелистывание значений и чтение регистров.)
  • существует как минимум 2 популярных синтаксиса для asm (Intel и AT & T), поэтому он фрагментирован
  • Как ни странно Intrinsics более популярны и поддерживаются, чем код asm в наши дни
  • не все компиляторы, находящиеся в моем радаре, теперь поддерживают встроенный asm, бит MSVC 64 - один; Я боюсь, что найду другие подобные недостатки, копаясь больше в наборах функций различных компиляторов, которые я должен использовать.
  • Учитывая trand, я думаю, что для меня более выгодно делать ставки на Intrinsics, это также должно быть проще, чем любой код asm.

И последний вопрос, на который я должен ответить, - это: как сделать подобную вещь с внутренними? Потому что я не нашел ничего, кроме кодов кода CPUID, чтобы получить такую ​​информацию вообще.

4b9b3361

Ответ 1

После некоторого копания я нашел полезные встроенные функции, специфичные для 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);
}

и, по-видимому, эти встроенные функции работают и с mingw-w64.

Ответ 2

Внутрисистемы, такие как это, также, как правило, специфичны для компилятора.

MS VС++ имеет __cpuid (и a __cpuidex) для генерации кода кода CPUID.

По крайней мере, насколько мне известно, gcc/g++ не дает эквивалента этому. Встроенная сборка, по-видимому, является единственным доступным вариантом.

Ответ 3

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.

Ответ 4

Для x86/x64 корпорация Intel имеет встроенную функцию _may_i_use_cpu_feature. Вы можете найти его в разделе "Общая поддержка" Intel Intrinsics Guide. Ниже приведен фрагмент документации Intel.

GCC якобы следует за Intel по отношению к внутренним характеристикам, поэтому он должен быть доступен под GCC. Мне это не ясно, если Microsoft предоставляет его, потому что они обеспечивают большинство (но не все) встроенных функций Intel.

Я ничего не знаю о ARM. Насколько мне известно, в ARM нет __builtin_cpu_supports("neon"), __builtin_cpu_supports("crc32"), __builtin_cpu_supports("aes"), __builtin_cpu_supports("pmull"), __builtin_cpu_supports("sha") и т.д. Для ARM вам необходимо выполнить проверку функций процессора.


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