Stai facendo una domanda giusta, allo stesso tempo è difficile dare una risposta semplice ad essa. Ci sono diversi aspetti coinvolti.
- Sovraccarico di iniziare nuovi thread (o prelevarli da una cache);
- Content sul bus di memoria.
- Gli aspetti precedenti differiscono e hanno costi molto diversi per piattaforme diverse.
I PC più grandi hanno diversi bus di memoria. Quelli più piccoli ne hanno solo uno Su un sistema bus di memoria questo non ha alcun senso. Se il tuo sistema ha diversi bus di memoria (canali), la tua serie di dati potrebbe avere una divisione arbitraria tra i banchi di memoria. Se accadrà che l'intero array si trova nella stessa banca di memoria, la parralelizzazione sarà inutile. Capire il layout del tuo array è di nuovo un overhead. In altre parole, prima di dividere l'operazione tra i core è necessario capire se vale la pena farlo o no.
La risposta semplice è che questi costi generali difficili da prevedere saranno molto probabilmente consumeranno il beneficio e peggioreranno il risultato complessivo.
Allo stesso tempo per un'area di memoria davvero enorme su alcune architetture ha senso.
fonte
2012-10-12 05:55:28
tale operazione probabilmente si attenuerebbe solo se la si parallelizzava - si avrebbe più core/cpus in lotta per l'accesso al bus di memoria. –
Forse usare l'istruzione specifica per spostare più byte una volta ti aiuterà. utilizzare la paralelizzazione avrà vantaggio solo quando i dati sono distribuiti in diverse parti di memoria. – wbao
L'unico caso in cui un 'memset' parallelo potrebbe essere più veloce è con blocchi di memoria molto grandi su un'architettura NUMA in cui ogni core lavora sulla memoria collegata al processore. –