In superficie sappiamo tutti che i migliori processori sono quelli che riescono a fare di più con meno, sviluppando la massima velocità possibile senza far salire i consumi energetici, ma una volta superata la barriera delle specifiche di base scopriamo che i processori moderni in generale cercano di pre-calcolare, anticipare e prevedere tutto ciò che passa attraverso di loro. Lo youtuber Matt Godbolt descrive questo attraverso cinque aspetti molto poco conosciuti dall'utente medio e che, nonostante la loro complessità tecnica, non smettono di affascinare.
Una delle prime cose che chiunque ricorda dei primi processori Atom è che erano lenti come lumache. In sostanza, ciò che Intel fece fu dare priorità ai bassi consumi rispetto alle prestazioni, applicando una nuova architettura basata su concetti antichi, e una delle cose rimaste nel dimenticatoio fu l'esecuzione out-of-order.
Di cosa si tratta? In termini rilassati, è uno dei tanti trucchi che i processori attuali hanno a disposizione per accelerare l'esecuzione delle istruzioni. Chiunque cerchi di capire meglio questi trucchi dovrà immergersi nello strano mondo delle architetture, e in particolare quelle sviluppate da Intel. L'alternativa è vedere questo video pubblicato da Matt Godbolt, che ne descrive cinque.
Cinque cose che fa una CPU
- Cercano di indovinare come si accede ai tuoi dati e riconoscono pattern, una forma di prefetching che si traduce in un importante aumento della velocità. In altre parole, caricano le linee di cache automaticamente prima che tu ne abbia bisogno, rimanendo un passo avanti rispetto al processo.
- Convertono CISC («Complex» Instruction Set Computing) in RISC («Reduced» Instruction Set Computing). Le operazioni della prima architettura vengono trasformate in una serie di «microcodice» o «micro-operazioni» che possono essere programmate in modo indipendente, guadagnando semplicità ed efficienza.
- Riorganizzano l'esecuzione del codice. L'ordine in cui il codice viene scritto non è l'ordine in cui viene eseguito dai processori. L'indipendenza tra blocchi permette di eseguire istruzioni mentre un altro gruppo è in attesa.
- Convertono il codice in SSA. Spiegare SSA in modo semplice è una sfida enorme, ma Godbolt lo riduce a una serie di ottimizzazioni che verificano se il codice è davvero indipendente (qualcosa di essenziale per le azioni precedenti) e, in caso contrario, lo riscrive per dargli questa proprietà. Nel suo esempio utilizza registri 'fittizi' come EAX1 e EAX2.
- Prevedono il futuro. Qui entra in gioco il cosiddetto predictor di salti, che come suggerisce il nome ha il compito di anticipare se un salto condizionale avverrà o no, classificando i risultati come speculativi. Se la previsione fallisce, vengono scartati. Se ha indovinato, sono già caricati. Più velocità.
In sintesi: precaricamento dei dati, conversione in microcodice, esecuzione out-of-order, rinomina dei registri e predizione dei salti. Se tutto questo ti ricorda quei cattivi ragazzi chiamati Spectre e Meltdown, è perché in un certo senso nascono da debolezze in queste attività. Il rapporto tra velocità e sicurezza richiede un equilibrio molto più delicato di quanto immaginiamo...
https://old.neoteo.com/como-trabaja-un-cpu/