So che le CPU moderne possono essere eseguite fuori servizio, tuttavia ritirano sempre i risultati in ordine, come descritto da wikipedia.Esecuzioni fuori servizio e recinzioni di memoria
"Out di processori Oder riempire queste 'slot' nel tempo con altre istruzioni che sono pronti, poi ri-ordinare i risultati alla fine di far sembrare che le istruzioni sono stati elaborati come normale."
Ora, quando si utilizzano le piattaforme multicore, è necessario utilizzare recinzioni di memoria perché, a causa dell'esecuzione fuori servizio, è possibile stampare qui il valore errato di x.
Processor #1:
while f == 0
;
print x; // x might not be 42 here
Processor #2:
x = 42;
// Memory fence required here
f = 1
Ora la mia domanda è, dal momento che in ordine processori (core in caso di processori multicore presumo) sempre in pensione i risultati in-order, allora che cosa è la necessità di recinzioni di memoria. I core di un processore multicore non vedono i risultati ritirati solo da altri core o vedono anche i risultati in volo?
intendo nell'esempio ho dato sopra, quando Processor 2 in pensione alla fine i risultati, frutto di x dovrebbe venire prima f, giusto? So che durante l'esecuzione dell'ordine potrebbe aver modificato f prima del x ma non deve essersi ritirato prima dello x, giusto?
Ora con il ritiro in ordine dei risultati e il meccanismo di coerenza della cache in atto, perché mai avresti bisogno di recinti di memoria in x86?
Si noti che le schermate di memoria vengono sempre in coppia nel codice corretto: quando due thread comunicano, * ogni * thread deve eseguire un ordinamento di accessi alla memoria (= fence). Di solito, uno di questi recinti ha una semantica di rilascio, l'altro ha acquisito la semantica. Nel tuo pseudocodice, Processor # 2 dovrebbe eseguire una fence di scrittura tra i compiti (semantica di rilascio) e Processor # 1 dovrebbe aggiungere una fence di lettura (acquisire semantica) tra il ciclo e 'print'. Alcune recinzioni potrebbero non essere necessarie su piattaforme specifiche, ma qualsiasi codice sorgente dovrebbe contenere entrambe le recinzioni (che possono essere compilate a noops). – cmaster