2012-02-13 12 views
5

Sto guardando un codice un po 'confuso che ha tentato un'astrazione di piattaforma delle istruzioni di prefetch, usando vari builtin del compilatore. Sembra essere basato inizialmente sulla semantica powerpc, con le variazioni di prefetch di Read e Write che utilizzano rispettivamente dcbt e dcbtst (entrambi questi passaggi TH = 0 nel nuovo opcode del flusso opzionale).Cercare i migliori equivalenti delle istruzioni di precaricamento per ia32, ia64, amd64 e powerpc

Sulle piattaforme IA64 che abbiamo di lettura:

__lfetch(__lfhint_nt1, pTouch) 

wherease per la scrittura:

__lfetch_excl(__lfhint_nt1, pTouch) 

Questo (leggi contro scrittura prefetching) sembra corrispondere la semantica PowerPC abbastanza bene (con l'eccezione che ia64 consente un suggerimento temporale).

Abbastanza stranamente il codice IA32/amd64 in questione sta utilizzando

prefetchnta 

Non

prefetchnt1 

come farebbe se tale codice dovesse essere coerente con le implementazioni ia64 (#ifdef varianti di tale nel nostro codice per la nostra (ancora in vita) porta hpipf e le nostre finestre ora morte e porte linux ia64).

Dal momento che stiamo costruendo con il compilatore Intel dovrei essere in grado a molte delle nostre piattaforme ia32/AMD64 consistenti passando ai comandi incorporati xmmintrin.h:

_mm_prefetch((char *)pTouch, _MM_HINT_NTA) 
_mm_prefetch((char *)pTouch, _MM_HINT_T1) 

... purché io riesco a capire cosa dovrebbe essere usato il suggerimento temporale

Domande:

  • sono lì leggono vs. istruzioni scrittura ia32/amd64 prefetch? Non vedo alcun riferimento nel set di istruzioni.

  • Sarebbe preferibile una delle variazioni temporali nt1, nt2, nta per il prefetching read vs. write?

  • Qualche idea se ci sarebbe stata una buona ragione per usare il suggerimento temporale NTA su ia32/amd64, ancora T1 su ia64?

+1

ARM, PowerPC e altri sistemi richiedono l'aiuto di un programmatore per il prefetch dei dati. È difficile battere la logica di prefetch di Intel sulle CPU x86. Di solito peggiorerai le cose provando a farlo manualmente. – BitBank

risposta

0

La migliore risorsa che ho trovato su x86 prefetching tipi suggerimento è stato il buon vecchio' articolo What Every Programmer Should Know About Memory.

Per la maggior parte su x86 non ci sono istruzioni diverse per prefetches di lettura e scrittura. Le eccezioni sembrano essere quelle allineate non temporali, in cui una scrittura può bypassare la cache ma, per quanto posso dire, una lettura verrà sempre memorizzata nella cache.

Sarà difficile tornare indietro perché i precedenti proprietari di codice hanno utilizzato un suggerimento e non l'altro su una determinata architettura. Potrebbero fare supposizioni su quanta cache è disponibile sui processori in quella famiglia, sulle tipiche dimensioni di working set per i binari, sui pattern di controllo del flusso a lungo termine, ecc ... e non si può dire quanto di tali ipotesi siano state supportate con buone ragionamento o dati.Da questo punto di vista limitato, penso che ti sarebbe giustificato adottare l'approccio che ha più senso per la piattaforma su cui ti stai sviluppando ora, indipendentemente da ciò che è stato fatto su altre piattaforme. Ciò è particolarmente vero quando si considerano articoli come this one, che non è l'unico contesto in cui ho sentito dire che è davvero molto difficile ottenere un guadagno in termini di prestazioni con i prefeti software.

Ci sono altri dettagli noti in primo piano, come i tipici rapporti di mancato utilizzo della cache quando si utilizza questo codice, o quanto ci si aspetta che i prefetches possano aiutare?

1
  • Ci sono leggere vs. istruzioni scrittura ia32/amd64 prefetch? Non vedo alcun riferimento nel set di istruzioni.

Alcuni sistemi supportano le istruzioni per prefetchw scrive

  • Would uno dei NT1, NT2, NTA variazioni temporali da preferire per la lettura vs. prefetching scrittura?

Se la linea è utilizzata esclusivamente dal thread chiamante, non dovrebbe importare come portare la linea, sia letture e le scritture sarebbe in grado di utilizzarlo. Il vantaggio per prefetchw menzionato sopra è che porterà la linea e ti darà la proprietà su di essa, il che potrebbe richiedere del tempo se la linea fosse usata anche da un altro core. Il livello di suggerimento d'altra parte è ortogonale con gli stati MESI e influenza solo quanto a lungo sopravviverà la linea prefissata. Questo è importante se si precarca molto prima dell'accesso effettivo e non si desidera effettuare il prefetch per perdersi in quella durata, o in alternativa - precaricare subito prima dell'accesso, e non si vuole che i prefetcher sovraccarichino troppo la cache.

  • Qualsiasi idea se ci sarebbe stato un buon motivo per usare il suggerimento temporale NTA su IA32/amd64, ma T1 su ia64?

Proprio speculando - forse le cache più grandi e la memoria aggressivo BW sono più vulnerabili al male prelettura e che ci si vuole ridurre l'impatto attraverso il suggerimento non-temporale. Considera che il prefetto è improvvisamente libero di andare a prendere tutto ciò che può, finirai per essere riempito di prefetches di posta indesiderata che eliminerebbero molte cachlines utili. Il suggerimento NTA li fa invadere a vicenda, lasciando il resto indenne.

Naturalmente questo potrebbe anche essere solo un bug, non posso dirlo con certezza, solo chi ha sviluppato il compilatore, ma potrebbe avere senso per la ragione sopra.

Problemi correlati