Le estensioni che introducono un nuovo stato architettonico richiedono un supporto speciale del sistema operativo, poiché il sistema operativo deve salvare/ripristinare il ripristino di più dati sulle opzioni di contesto. Quindi, dal punto di vista del sistema operativo, non c'è nulla di extra da fare per far sì che il codice spazio utente esegua le istruzioni SSSE3, se il sistema operativo supporta SSE.
SSE, AVX e AVX512 sono le estensioni che hanno introdotto un nuovo stato architettonico.
- SSE introdotto regs XMM (e MXCSR per le modalità e FP stato di eccezione arrotondamento)
- AVX introdotto ymm (la metà inferiore dei quali sono vecchi REGS XMM).
- AVX512 ha introdotto zmm (estendendo i registri ymm) e ha anche raddoppiato il numero di reg di vettore in modalità 64 bit: zmm0-zmm31.
Controllate per il supporto di CPU per SSE o AVX modo consueto, con l'istruzione CPUID.
Per evitare il danneggiamento di dati inattivi quando si utilizza una nuova estensione su un sistema operativo multitasking che non salva/ripristina il nuovo stato architettonico sugli switch di contesto, le istruzioni SSE segnalano come istruzioni non valide se il sistema operativo non ha set an OS-support bit in a control register. Quindi le estensioni vettoriali "non funzionano" su sistemi operativi che non conoscono il salvataggio/ripristino dello stato necessario per tale estensione.
Per SSE, potrebbe non esserci alcun modo indipendente dal sistema operativo pulito per rilevare che il sistema operativo ha promesso di salvare/ripristinare lo stato SSE interruttori di contesto impostando il CR4.OSFXSR
, ecc CR4.OSXMMEXCPT
bit, perché even reading a control register is privileged e non c'è un bit CPUID che rifletta le impostazioni. Su Windows, è possibile utilizzare GetEnabledXStateFeatures
per verificare che il sistema operativo sappia come salvare/ripristinare lo stato del registro vettoriale. Non sono sicuro di cosa hai bisogno su altri sistemi operativi; Il supporto SSE è così diffuso che dovresti usare un OS (o homebrew) molto antico per far sì che questo sia un problema.
Per AVX, non abbiamo bisogno di supporto del sistema operativo per rilevare che AVX è utilizzabile (supportato da hardware e abilitato dal sistema operativo): CPUID include una funzione po OSXSAVE che verrà impostato quando il sistema operativo ha abilitato AVX.
Da Intel's intro to AVX:
- Verificare che il sistema operativo supporta XGETBV utilizzando
CPUID.1:ECX.OSXSAVE bit 27 = 1
.
- Allo stesso tempo, verificare che
CPUID.1:ECX bit 28=1
(Intel AVX supportato) e/o bit 25 = 1 (AES supportato) ... (e altri bit per FMA, AES e PCLMULQDQ)
- Issue
XGETBV
e verificare che la maschera abilitata per funzioni ai bit 1 e 2 sia 11b
(stato XMM e stato YMM abilitato dal sistema operativo ).
Può essere più facile per chiamare una funzione del sistema operativo fornito per rilevare il supporto del sistema operativo, invece di utilizzare asm in linea o una libreria di caratteristiche di rilevamento di fare tutto questo.
Lo stesso vale per AVX512: è possibile controllare il bit funzione CPUID per il set di istruzioni, e verifica che il sistema operativo ha promesso di gestire il nuovo stato architettonica del contesto commuta abilitando il Bit destro in con XSETBV. (Quindi dovresti controllare con XGETBV).
fonte
2015-12-03 16:37:21
@downvoters: questa non è una domanda brutta, rispetto alla maggior parte, anche se risulta non avere una risposta molto interessante. L'OP non lo sapeva, o non avrebbe chiesto. È chiaro e sembra che l'OP abbia provato a cercare, ma non sapeva su cosa cercare (perché non conosce già la risposta alla domanda: P) Posso vedere chiuderlo come off-topic per SO/migrare a SU, ma non ai downvotes. –
Non penso che sia una domanda SU, dubito che la codifica in assembly sia qualcosa che anche i più super utenti fanno. Riformulerò la domanda per rendere più chiaro che sto cercando di utilizzare gli opcode nei miei programmi. – Alexey
Non vedo come questa domanda sia solo "sul software di calcolo generale". Il solo fatto che contenga "Windows" non significa che sia fuori tema qui. Questa è una domanda sulle piattaforme dal punto di vista dei programmatori ed è chiaramente importante per coloro che codificano in SSE/AVX/etc. – stgatilov