Domanda

Sto cercando un punto di riferimento sulle differenze tra i modelli di memoria utilizzate da .NET CLR / JIT su x86 / x64 / ia64. So che ci sono alcune differenze tra x86 e ia64 (riordino di istruzioni, la rimozione di istruzione, ecc), ma non ho trovato un riferimento sulle differenze tra x86 e x64.

Ho una domanda che sta puntando per alcuni numeri di latenza molto stretti, e verrà eseguito solo su x86 in questo momento, e forse su x64 (sicuramente non su ia64). Mi chiedo se posso contare su alcuni manufatti dell'attuazione x86 JIT ed essere ancora relativamente sicura su x64, o se dovrei programmazione alla JIT perdente ia64 (che richiederà più campi siano barriere volitile e di memoria da inserire in diversi posti).

Grazie in anticipo per tutti gli indicatori.

È stato utile?

Soluzione

Due articoli sul modello di memoria .NET (che è più forte rispetto al modello ECMA, btw):

Il libro di Joe Duffy, programmazione concorrente su Windows , è anche una grande fonte di informazioni su questo argomento.

Altri suggerimenti

Il modello di memoria .NET è specificato nella specifica ECMA ISO / IEC-23271. In particolare nella partizione I: Concetti e Architettura, Capitolo 12.6 "modello di memoria e ottimizzazioni".

Questa norma definisce i confini di un JIT può operare. Se si vuole essere neutrale per l'architettura, si dovrebbe seguire questo standard e non utilizzare qualsiasi specifiche delle squadre investigative comuni x86 / x64.

Inoltre x64 è un'evoluzione di x86, consiste principalmente di ulteriori istruzioni, registri e alcune estensioni (SSE2) essendo definiti come base per tutti i processori compatibili x64. C'è stato quasi nessun cambiamento di modelli di memoria, tranne che per lo spazio di indirizzo aggiuntivo e ulteriore modalità di indirizzamento (puntatore all'istruzione relativa accesso ai dati.) Quindi, l'ottimizzazione per il JIT x86 dovrebbe dare buoni risultati su x64 troppo.

Questo potrebbe essere di gran lunga troppo basso livello che voi, ma alcune CPU bit AMD 64 anziani non hanno CMPXCHG16B ( Fonte ) se si fa affidamento sul che, come un hardware di istruzione non-blocking .

Inoltre sembra che ci siano cambiamenti nel modello di memoria per C ++ che può essere rilevante in modo potrebbe essere necessario tenere d'occhio se si sta facendo il codice livello molto basso.

Il modello di memoria 'specificata' dal CLR è un tema costante del dibattito all'interno di Microsoft (discusso apertamente, almeno fin dal 2003 ). Come nota a margine Chris Brumme afferma in tale articolo che il modello di x64 è la stessa di 86, che vorrei assumere è una dichiarazione precisa ai fini del CLR ospitato codice.

A meno che i tuoi utenti di destinazione includono esplicitamente Itanium Vorrei pensare che semplicemente compreso un ripiego, più lento ma semplice e sicuro, per l'attuazione che l'architettura sarebbe sufficiente per la correttezza. Non v'è quindi alcuna necessità di indicare che il software è rotto su quella piattaforma, solo che opera in una modalità fallback più lento. Se la gente in seguito vogliono utilizzare la piattaforma sul serio è possibile codificare per che molto modello più flessibile.

Si noti che il JIT x64 è diverso dal JIT x86 (in modo significativo dal 3,5 SP1) così ogni uscita test Mode non è rappresentativo dell'altro e viceversa. Test. A seconda dei casi

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top