Da un punto di vista del supercomputing è meglio non pensare in termini di carico CPU / GPU in percentuale, ma piuttosto determinare quante operazioni il tuo problema ha bisogno e poi confrontarlo con le prestazioni di punta del sistema.
Se si ottiene il 100% di utilizzo della CPU, non significa necessariamente che si ottengano tutte le prestazioni dal sistema. Le CPU possono spesso fare più cose nello stesso momento, ad esempio una divisione e un'aggiunta. Se è possibile avviare la divisione in anticipo, è possibile che si sovrapponga all'aggiunta. Molto probabilmente la tua CPU desktop ha un'unità fuori uso che riorganizzerà le istruzioni per trarre vantaggio da tali sovrapposizioni. O se hai il seguente programma:
if (expr1)
expr2;
else
expr3;
Una CPU di riordino proverà a calcolare le tre espressioni allo stesso tempo e quindi a buttare via il risultato di una di esse. Questo lo rende più veloce nel complesso. Se hai qualche blocco nel tuo programma e non puoi riordinare, allora stai utilizzando meno corsie nella CPU, ma probabilmente mostrerà ancora il 100%.
Poi hai le funzionalità SIMD nelle CPU che sono operazioni vettoriali. È come la GPGPU-light, nel senso che di solito hai solo quattro o otto operazioni allo stesso tempo, le GPU piacciono 32 o 64. Comunque devi usarlo per tirare fuori il FLOPS.
Stuff come la condivisione falsa può portare a un costo di sincronizzazione pesante che di solito si presenta come carico del kernel in Linux. La CPU è completamente utilizzata ma non hai un throughput molto utile.
Ho fatto qualche programmazione su una macchina IBM Blue Gene / Q. Ha molti livelli di gerarchia ( schema di Blue Gene / L obsoleto) ed è quindi difficile da programmare in modo efficiente. Dovrai utilizzare la gerarchia completa fino a SIMD e SMT (Intel chiama questo HyperThreading) per ottenere le prestazioni.
E poi la rete ti limita spesso. Pertanto risulta che è più veloce in (wall clock) il tempo di calcolare le cose su più CPU allo stesso tempo invece di comunicarlo attraverso la rete. Questo caricherà più carico sulle CPU e farà accelerare il programma. Ma il throughput effettivo del programma non è buono come sembra dai numeri grezzi.
Se aggiungi GPU al mix, diventerà ancora più difficile orchestrare tutto questo per ottenere prestazioni. Questa sarà una delle cose che comincerò a fare nella mia tesi di laurea di QC su Lattice tra un paio di mesi.