Rilevazione dell’architettura della CPU in fase di compilazione

Qual è il modo più affidabile per scoprire l’architettura della CPU durante la compilazione del codice C o C ++? Per quanto ne so, diversi compilatori hanno il proprio set di definizioni di preprocessore non standard ( _M_X86 in MSVS, __i386__ , __arm__ in GCC, ecc.).

C’è un modo standard per rilevare l’architettura che sto costruendo? In caso contrario, esiste una fonte per un elenco completo di tali definizioni per vari compilatori, ad esempio un’intestazione con tutti gli #ifdef s?

Ecco alcune informazioni su Macro Architecture predefinite e altri tipi di macro predefinite.

Questa domanda chiede dove sono definiti nel codice sorgente GCC.

Non esiste uno standard per gli interpreti, ma ogni compilatore tende ad essere abbastanza coerente. Puoi creare un’intestazione per te che è qualcosa del genere:

 #if MSVC #ifdef _M_X86 #define ARCH_X86 #endif #endif #if GCC #ifdef __i386__ #define ARCH_X86 #endif #endif 

Non ha molto senso un elenco completo, perché ci sono migliaia di compilatori ma solo 3-4 in uso diffuso (Microsoft C ++, GCC, Intel CC, forse TenDRA?). Decidi quali compilatori la tua applicazione supporterà, elencare i loro #define e aggiornare l’intestazione secondo necessità.

Se desideri scaricare tutte le funzionalità disponibili su una piattaforma specifica, puoi eseguire GCC come:

gcc -march=native -dM -E -

#define __SSE3__ 1 Marcos come #define __SSE3__ 1 , #define __AES__ 1 , ecc.

Non c’è niente di standard. Brian Hook ne ha documentato un po ‘nel suo “Portable Open Source Harness”, e persino cerca di renderli coerenti e utilizzabili (ymmv a riguardo). Vedi l’intestazione posh.h in questo sito:

Nota, il link sopra potrebbe richiedere di inserire qualche user id / password fasulli a causa di un attacco DOS qualche tempo fa.

Se hai bisogno di un rilevamento a grana fine delle caratteristiche della CPU, l’approccio migliore è quello di spedire anche un programma CPUID che emette sullo stdout o su un file “cpu_config.h” l’insieme di funzioni supportate dalla CPU. Quindi si integra quel programma con il processo di compilazione.