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?
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