Le architetture della CPU sono orientate verso i runtime procedurali?


13

Ci sono modifiche che potrebbero essere apportate alle CPU per renderle più performanti per i runtime simultanei come Rust? Ad esempio, ci sono modifiche alle implementazioni di previsione delle filiali o alle dimensioni della cache che potrebbero aiutare i runtime simultanei?

Ho l'impressione che gli attuali progetti di CPU potrebbero essere ottimizzati maggiormente per i runtime procedurali come C. Se invece avessimo intenzione di ottimizzare per i runtime simultanei, come apparirebbero le CPU diverse?

Per quanto riguarda l'istanza, la previsione del ramo è stata implementata sulla base di generalizzazioni tratte in articoli di ricerca che analizzano i codici procedurali. Mi chiedo se l'astrazione della concorrenza aggiungerà un set di lavoro significativo al runtime che influisce negativamente sugli algoritmi di previsione del ramo esistenti. Ad esempio, prevedere in un ciclo for è una cosa, ma quando la destinazione del ramo è sempre una nuova porzione di memoria (grafica, testo, ecc.), Ci sarà sempre un errore nella cache e non ci sarà mai ramo storia per questo, perché nessuno dei due l'ha ancora toccato.

Questa è probabilmente una domanda sciocca perché il contenuto, sebbene possa essere sempre nella RAM, sarà ramificato a un ordine di grandezza inferiore a quello che verrà utilizzato (una volta caricato nella cache) ... ma comunque, lì dovrebbe essere un limite temporale osservabile per i contesti memorizzati nella cache e predittori di diramazioni in un runtime procedurale, che si manifesterebbe come un confine di astrazione in un ambiente più parallelizzato. Quindi mi chiedo ... Sono stati rispettati questi confini? Alcuni documenti di ricerca lo hanno analizzato?

Le architetture della CPU sono orientate verso il codice procedurale rispetto al codice concorrente; o le moderne CPU sono sufficientemente generiche da non subire un linguaggio altamente concorrenziale?


2
Hai esaminato la letteratura sull'architettura Itanium (IA-64)? È stato progettato con grandi sogni di ultraparallelismo, ma poi le persone non sono riuscite a creare compilatori che avrebbero sfruttato le funzionalità della CPU e il software non ha funzionato così bene dopo tutto.
Gilles 'SO- smetti di essere malvagio' il

@Gilles sì. Sebbene una domanda diversa, questa è in realtà un'osservazione interessante: forse il parallelismo inserito in Itanium sarebbe più adatto alle moderne lingue concorrenti?
paIncrease

@Gilles: E allo stesso modo, la nuova architettura Mill sembra essere stata costruita pensando al parallelismo e agli switch a basso costo. Ad esempio, utilizzando un unico spazio di indirizzi virtuali per tutti i "processi", rimanda il TLB tra l'ultimo livello di cache e i controller del dispositivo (vedere la diapositiva 49 di millcomputing.com/docs/memory ).
Matthieu M.

1
@pedAntic Rust che necessita di un runtime è un'idea sbagliata facile da realizzare: chat.stackoverflow.com/transcript/message/24171983#24171983 . La tua domanda sembra supportare questo malinteso che non è una buona cosa per Rust.
ArtemGr,

1
@pedAntic Vedete, Rust ha avuto un runtime simultaneo (per il threading verde), ma non lo fa più. In questo momento Rust è in gran parte nella stessa lega di C per quanto riguarda il profilo delle prestazioni della concorrenza. L'unica differenza rispetto a C è che l'analisi statica in Rust rende la concorrenza per lo più sicura.
ArtemGr,

Risposte:


1

Probabilmente è più il caso che le architetture informatiche moderne siano progettate con l'obiettivo di migliorare la qualità del codice generato dai compilatori rispetto a un budget di costi nella zona del die e della potenza utilizzata. Le librerie di runtime sono solo un'istanza specifica di codice compilato che deve essere eseguita in modo efficiente.

Per molto tempo, il linguaggio di destinazione per la maggior parte delle architetture è stato il linguaggio "C". Ciò riflette le modeste richieste che quel linguaggio ha sul suo hardware e il fatto che sia diventato un linguaggio di programmazione dei sistemi quasi universale (mi dispiace Rust and Go, hai una lunga strada da percorrere per battere C).

Una conseguenza di ciò sembra essere che i nuovi linguaggi sono spesso definiti in termini di semantica C equivalente, in modo da evitare la necessità di strutture di elaborazione che potrebbero essere assenti sui computer attuali.

Il vantaggio per un processore che si abbina bene con i compilatori moderni è che il codice di quei compilatori funziona bene e il processore ha almeno una possibilità di essere competitivo. Il costo del fallimento qui condanna il processore prima che possa iniziare. Solo due esempi negativi includono l'iAPX-432 e l'Itanium, entrambi di Intel. Entrambi avevano un rapporto molto scarso con i loro compilatori (rispettivamente Ada e C) con il fallimento dei prodotti che si trasformavano in un gioco di colpa tra silicio e software.


0

Senza dubbio sì.

In particolare, il modello di comunicazione implicito da C99 è la memoria condivisa. Le lingue concorrenti più avanzate hanno modelli di comunicazione più ricchi, come i canali di passaggio dei messaggi (come in Rust).

Le architetture CPU moderne hanno un supporto hardware esplicito per la memoria condivisa. In particolare, i protocolli di coerenza della cache come MESI sono implementati in porte e fili reali. Non esiste un vero supporto per il passaggio dei messaggi tra i processi, anche se l'idea del passaggio dei messaggi non è estranea alla CPU. I moderni bus PCI-e emulano persino la memoria condivisa utilizzando il passaggio dei messaggi, mentre i processi della CPU devono emulare il passaggio dei messaggi utilizzando la memoria condivisa!

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.