Domanda

Il massimo teorico della larghezza di banda della memoria per un processore Core 2 con memoria a doppio canale DDR3 è impressionante: Secondo Articolo di Wikipedia sull'architettura, 10+ o 20+ gigabyte al secondo. Tuttavia, le chiamate stock memcpy () non raggiungono questo obiettivo. (3 GB / s è il più alto che abbia mai visto su tali sistemi.) Probabilmente, ciò è dovuto al requisito del fornitore del sistema operativo che memcpy () deve essere ottimizzato per ogni linea di processore in base alle caratteristiche del processore, quindi un'implementazione di memcpy () dovrebbe essere ragionevole su un ampio numero di marchi e linee.

La mia domanda: esiste una versione liberamente disponibile e ottimizzata per i processori Core 2 o Core i7 che può essere utilizzata in un programma C? Sono sicuro di non essere l'unica persona che ne ha bisogno, e sarebbe un grande spreco di sforzo per tutti micro-ottimizzare il proprio memcpy ().

È stato utile?

Soluzione

Se specifichi / ARCH: SSE2 su MSVC dovrebbe fornirti un memcpy sintonizzato (almeno, il mio lo fa).

In caso contrario, utilizzare i carichi intrinseci SSE allineati / archiviare te stesso per copiare la memoria in grossi blocchi, impiegando un dispositivo di Duff di letture di parole laddove necessario per gestire la testa e la coda dei dati per arrivare a un confine allineato. Per ottenere buone prestazioni, dovrai anche utilizzare le funzionalità intrinseche di gestione della cache.

Il tuo fattore limitante è probabilmente la mancanza di cache e la larghezza di banda di Southbridge, piuttosto che i cicli della CPU. Dato che ci sarà sempre molto altro traffico sul bus di memoria, di solito sono felice di raggiungere circa il 90% del throughput teorico della larghezza di banda della memoria in tali operazioni.

Altri suggerimenti

Quando hai misurato la larghezza di banda hai preso in considerazione che memcpy era sia una lettura che una scrittura, quindi 3 GB / s di memoria copiata sono in realtà 6 GB / s di larghezza di banda?

Ricorda, la larghezza di banda è teoricamente massima - l'uso nel mondo reale sarà molto più basso. Ad esempio, un errore di pagina e la larghezza di banda scenderanno a MB / s.

memcpy / memmove sono elementi intrinseci del compilatore e di solito saranno inline per rep movsd (o le istruzioni SSE appropriate se il compilatore può scegliere come target). Potrebbe essere impossibile migliorare il codegen su questo, dal momento che le moderne CPU gestiranno molto bene le istruzioni dei rep.

Potresti scrivere il tuo. Prova a utilizzare intel ottimizzando il compilatore per direttamente mirare all'architettura?

Intel produce anche qualcosa chiamato VTune (compilatore e lingua indipendente) per l'ottimizzazione delle applicazioni.

Ecco un articolo sull'ottimizzazione di un motore di gioco.

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