2013-07-20 15 views
14

Considerando che sto codifica in C++, se possibile, vorrei utilizzare una soluzione Intrinsics simile per leggere informazioni utili circa l'hardware, le mie preoccupazioni/considerazioni sono:Intrinsics per informazioni come CPUID?

  • non so assemblaggio beh, sarà un investimento considerevole solo per ottenere questo tipo di informazioni (nonostante sembri CPU si tratta solo di lanciare valori e leggere registri.)
  • c'è almeno 2 sintassi popolare per asm (Intel e AT & T) , quindi è frammentato
  • stranamente abbastanza Intrinsics sono più popolari e supportati del codice asm in questi giorni
  • non tutti i compilatori che sono nel mio radar adesso supportano in linea asm, MSVC 64 bit è uno; Ho paura di trovare altri difetti simili mentre sto scavando di più nei set di funzionalità dei diversi compilatori che devo usare.
  • considerando il trand penso che sia più produttivo per me scommettere su Intrinsics, dovrebbe essere anche molto più semplice di qualsiasi codice asm.

E l'ultima domanda a cui devo rispondere è: come fare una cosa simile con gli intrinsechi? Perché non ho trovato niente di diverso dagli opcode CPUID per ottenere questo tipo di informazioni.

+0

Clang ha un assemblatore integrato, e il suo sostegno per il montaggio stile Intel è imprevedibile a volte. Non può generare un semplice 'negate (neg)' in stile Intel. – jww

risposta

10

Dopo alcune operazioni di scavo I have found, una funzione incorporata utile specifica di gcc.

L'unico problema è che questo tipo di funzioni sono davvero limitati (in pratica si hanno solo 2 funzioni, 1 per la CPU "nome" e 1 per il set di registri)

un esempio è

#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); 
} 

e apparentemente queste funzioni integrate funzionano anche con mingw-w64.

+0

Dalla domanda: * "non tutti i compilatori ... supportano in linea asm, MSVC 64 bit è uno" *. Il codice fornito non funziona certamente sui compilatori Microsoft. Dovresti evitare di accettare la tua risposta fino a quando non avrai entrambe le soluzioni GCC e MS. – jww

7

Intrinsics come questo sono in genere specifici del compilatore.

MS VC++ ha un __cpuid (e uno __cpuidex) per generare un codice op CPUID.

Almeno per quanto ne so, gcc/g ++ non fornisce un equivalente a questo però. L'assemblaggio in linea sembra essere l'unica opzione disponibile.

+1

Ho trovato qualcosa http://stackoverflow.com/a/17759098/2485710 – user2485710

+1

gcc fornisce un'intestazione 'cpuid.h' che fornisce una macro' __cpuid' (definita in modo diverso da MSVC, intendiamoci) e una '__get_cpuid' funzione. – rdb

6

Gcc include un'interfaccia CPUID:

http://gcc.gnu.org/git/?p=gcc.git;a=blob;f=gcc/config/i386/cpuid.h

Questi non sembrano essere ben documentato, ma esempio di utilizzo può essere trovato qui:

http://gcc.gnu.org/git/?p=gcc.git;a=blob_plain;f=gcc/config/i386/driver-i386.c

noti che è necessario utilizzare __cpuid_count() e non __cpuid() quando il valore iniziale di ecx è importante, ad esempio con rilevamento avx/avx2.

Come sottolineato dall'utente2485710, gcc può eseguire tutte le operazioni di rilevamento delle funzioni della cpu per voi. A partire da gcc 4.8.1, l'elenco completo delle funzionalità supportate da __builtin_cpu_supports() è: cmov, mmx, popcnt, sse, sse2, sse3, ssse3, sse4.1, sse4.2, avx e avx2.

2

Per x86/x64, Intel fornisce un intrinseco chiamato _may_i_use_cpu_feature. Puoi trovarlo nella categoria Supporto generale della pagina Intel Intrinsics Guide. Di seguito è riportato un rip della documentazione di Intel.

GCC presumibilmente segue Intel rispetto agli intrinsechi, quindi dovrebbe essere disponibile in GCC. Non mi è chiaro se Microsoft lo fornisce perché fornisce la maggior parte (ma non tutte) le intrinseche Intel.

Non sono a conoscenza di nulla per ARM. Per quanto ne so, non c'è __builtin_cpu_supports("neon"), __builtin_cpu_supports("crc32"), __builtin_cpu_supports("aes"), __builtin_cpu_supports("pmull"), __builtin_cpu_supports("sha"), ecc. Sotto ARM. Per ARM devi eseguire CPU feature probing.


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