2012-10-12 8 views
6

Non ne sono sicuro. Posso scrivere un memset di grandi dimensioni (ad esempio 10 MB), su quattro core per aumentare la velocità con questo?I memset possono essere parallelizzati su 4 core?

La parallelizzazione di tale ram-chip è possibile e anche quanto costano i costi di accensione di altri thread: è più di un millisecondo o meno?

+5

tale operazione probabilmente si attenuerebbe solo se la si parallelizzava - si avrebbe più core/cpus in lotta per l'accesso al bus di memoria. –

+0

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

+4

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. –

risposta

2

Stai facendo una domanda giusta, allo stesso tempo è difficile dare una risposta semplice ad essa. Ci sono diversi aspetti coinvolti.

  1. Sovraccarico di iniziare nuovi thread (o prelevarli da una cache);
  2. Content sul bus di memoria.
  3. 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.

+0

Vale la pena determinare l'avvio del programma se vale la pena di parrallizzare * memset * e decidere in fase di esecuzione? –

+0

Questo potrebbe succedere durante l'avvio del sistema operativo. La CPU è la stessa per tutte le app che verranno avviate. D'altra parte la divisione tra i banchi di memoria sarà sempre diversa e non facile da valutare. –

+1

Nelle moderne CPU, un singolo core della CPU può tranquillamente saturare tutti i bus di memoria durante la scrittura degli zeri. Quindi anche allora non c'è ragione di parallelizzare. – MSalters

Problemi correlati