Il software moderno utilizza selettivamente le diverse funzionalità della CPU?


2

Ad esempio, è possibile avere un eseguibile che utilizza funzionalità per processori Core 2 e quindi utilizzare selettivamente altre funzionalità per un processore più vecchio? O è un requisito per compilare un altro eseguibile? E se no, è vero per tutti i casi?


3
Insomma sì. Avresti più percorsi di codice a seconda dei set di funzionalità esistenti (come MMX, SSE, ...). È inoltre possibile compilare versioni diverse dell'eseguibile, una che richiede il set di funzionalità e una che non lo fa, quindi è possibile rimuovere il controllo delle funzionalità dal percorso del codice interno.
Der Hochstapler,

Risposte:


4

È del tutto possibile, a seconda delle funzionalità a cui ti riferisci all'approccio è leggermente diverso.

Ad esempio, per un'applicazione matematica, è possibile rilevare il numero di processori e / o core e quindi far sì che ciascun core gestisca parti diverse del calcolo. La parte difficile è quindi assicurarsi che i dati siano sincroni o asincroni a seconda dell'attività da svolgere.

E, come affermato prima di cose come MMX, SSE2 può essere verificato e quindi eseguire tramite percorsi di codice diversi, qualcosa del tipo:

if (CPU.Supports SSE2) {then use SSE2 Libraries}
else if (CPU.Supports SSE) {Then use SSE Libraries}
else {use pre-SSE LIbraries}

Inoltre, per cose come architechture (x86 vs x64) ci sono alcuni modi che possono essere gestiti. Se usi JAVA, o C #, ad esempio, il compilatore JIT può ottimizzare il codice per entrambe le architetture all'avvio dell'applicazione, probabilmente non è veloce come un'applicazione C ++ nativa e ben ottimizzata, ma il compromesso è che con C ++ avresti avere una versione x64 e una versione x86 separate.


2

È possibile disporre di un eseguibile in cui il runtime rileva la CPU utilizzata, quindi seleziona il modo migliore per utilizzarli. Ofc. ognuno di questi "modi migliori" è precompilato. Quindi stai fondamentalmente usando un programma che è stato preparato per usare in modo ottimale alcuni processori / set di istruzioni selettivi.

Non ci sono molti programmi che sembrano farlo, o almeno non molti che ne parlino all'utente. Tuttavia, ce ne sono almeno alcuni, ad esempio l' eseguibile dnetc .


Se lo desideri, puoi confrontarlo con un libro o un opuscolo, con un indice indicante:
pagina 10-20: inglese
pagina 21-42: olandese
pagina 43-54: inglese americano
pagina 55-70: danese
...

Dovrai scrivere, nella lingua / set di istruzioni appropriato per ognuno di questi.


.Net non lo fa, ma invece di più eseguibili precompilati, utilizza un formato proprietario per incapsulare il codice sorgente e compilarlo al volo?
MarcusJ,

Può farlo solo per certe cose. Se importate SSE2, ad esempio, .NET non è sempre in grado di sapere come utilizzare SSE, potrebbero esserci nuove classi / metodi nella nuova libreria. D'altro canto, la nuova versione potrebbe escludere metodi obsoleti dal SSE originale.
Austin T, francese,

Mplayer ha alcune funzionalità di rilevamento della CPU e ne parla all'utente.
Ярослав Рахматуллин,

0

Il kernel di Linux utilizza tecniche spaventose come l'applicazione di patch al kernel in esecuzione per selezionare l'algoritmo migliore per alcune funzioni molto utilizzate.


Quando compili il kernel Linux su X86 hai anche la possibilità di selezionare una CPU di destinazione. (Ad esempio 386, P6, ...). In questo modo parte del kernel è già ottimizzata prima di eseguirlo,
Hennes
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.