2009-06-03 16 views
10

Ho bisogno di un suggerimento su come faccio a copiare un blocco di memoria in modo efficiente, in un singolo tentativo, se possibile, in C++ o linguaggio assembly.copia blocco di memoria

Ho un puntatore alla posizione di memoria e offset. Pensa a una memoria come a un array 2D che devo copiare composto da righe e colonne.

risposta

4

Se è necessario implementare tali funzionalità da soli, suggerisco di controllare Duff's Device se deve essere fatto in modo efficiente.

+0

beh la risposta mi ha aiutato a salvarmi pochi millisecondi. –

38

Che ne dici di std::memcpy?    

+0

Sì, utilizzare memcpy, poiché di solito è ottimale per l'architettura di destinazione. Sulle architetture x86, le implementazioni ottimali utilizzano alcuni registri SSE a 128 bit. –

+0

beh, l'avevo già provato. Cosa memcopy fa che copia una riga alla volta. Pensa che ho un blocco composto da 5000 o più righe e in una funzione che viene chiamata tutte le volte 10000 volte. –

+2

Se tutte le righe sono contigue nella memoria, è possibile copiare tutte le righe in una singola chiamata memcpy. Se gli spazi tra le righe nella memoria sono piccoli, una singola chiamata memcpy sarà probabilmente il modo più veloce. Se tutte le righe sono allocate separatamente, sarà necessario un ciclo di memcpy. –

2

Leggendo i tuoi commenti, sembra che potresti voler usare il parallelismo. Ci sono istruzioni per farlo, ma funzionano solo su registri, non su memoria.

Questo a causa del modo in cui l'architettura del computer è (sto assumendo x86).

È possibile accedere a una sola posizione di memoria alla volta perché il computer ha solo un bus di indirizzo. Se si provasse ad accedere a più di una posizione alla volta, si sovraccaricherebbe il bus e nulla funzionerebbe correttamente.

Se è possibile inserire i dati necessari nei registri, è possibile utilizzare numerose e interessanti istruzioni del processore, come MMX o SSE, per eseguire calcoli paralleli. Ma per quanto riguarda la copia della memoria in parallelo, non è possibile.

Come altri hanno già detto, utilizzare memcpy. È affidabile, corretto e veloce.

0

REP MOVSD in assemblaggio, forse? Difficile dire senza ulteriori informazioni su esattamente ciò che stai cercando di copiare ... Oppure puoi riprogrammare il controller DMA anche per farlo, ma in realtà finirà per essere più lento del semplice utilizzo del processore. :-)

1

Utilizzare memmove() se l'origine e la fonte si sovrappongono. Di solito memcpy() e memmove() sono stati già ottimizzati per il clib del compilatore. Se si scrive una sostituzione, almeno confrontarla con le versioni clib per assicurarsi di non rallentare il codice.

Ho un blocco consistente di 5000 righe o più e in una funzione che si chiama tutto il tempo 10000 volte

Inoltre, pensare di cambiare la struttura dei dati. Forse invece di un array 2D, è possibile avere un array 1D di puntatori su matrici secondarie (le colonne). Quindi, invece di copiare tutte le righe, è sufficiente copiare o spostare i puntatori. Puoi raggruppare gli array di colonne in una lista libera in modo da non dedicare molto tempo alla loro allocazione e alla loro liberazione.

Problemi correlati