Domanda

In quali circostanze dovrei aspettarmi che memcpys superi le prestazioni dei moderni hardware INTEL / AMD? Sto usando GCC 4.2.x su una piattaforma Intel a 32 bit (ma sono interessato anche a 64 bit).

È stato utile?

Soluzione

Non dovresti mai aspettarti che superino i compiti. Il motivo è che il compilatore utilizzerà comunque memcpy quando pensa che sarebbe più veloce (se si usano i flag di ottimizzazione). In caso contrario e se la struttura è abbastanza piccola da adattarsi ai registri, è possibile utilizzare la manipolazione diretta dei registri che non richiederebbe alcun accesso alla memoria.

GCC ha internamente speciali schemi di blocco dei blocchi che scoprono quando cambiare direttamente i registri / le celle di memoria o quando usare la funzione memcpy. Nota quando assegni la struttura, il compilatore sa al momento della compilazione quanto sarà grande la mossa, quindi può srotolare piccole copie (fare una mossa n-volte in fila invece che in loop) per esempio. Nota -mno-memcpy :

-mmemcpy
-mno-memcpy
    Force (do not force) the use of "memcpy()" for non-trivial block moves.  
    The default is -mno-memcpy, which allows GCC to inline most constant-sized copies.

Chi lo sa meglio quando usare memcpy del compilatore stesso?

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