C'è stata molta discussione su come scegliere i blocchi # & blockSize, ma mi manca ancora qualcosa. Molti dei miei preoccupazioni rispondere a questa domanda: How CUDA Blocks/Warps/Threads map onto CUDA Cores? (Per semplificare la discussione, c'è abbastanza perThread & memoria perBlock limiti di memoria non sono un problema qui..)blocchi, discussioni, deformabilità Dimensione
kernelA<<<nBlocks, nThreads>>>(varA,constB, nThreadsTotal);
1) Per mantenere la SM occupato come possibile, Devo impostare nThreads
su un multiplo di warpSize
. Vero?
2) Un SM può eseguire solo un kernel alla volta. Questo è tutto ciò che HWcores di SM sta eseguendo solo kernelA. (Non alcuni HWcores che eseguono kernelA, mentre altri eseguono kernelB.) Quindi se ho solo un thread da eseguire, sto "sprecando" gli altri HWcores. Vero?
3) Se i problemi del warp-scheduler funzionano in unità di warpSize
(32 thread) e ogni SM ha 32 HW, l'SM verrà utilizzato completamente. Cosa succede quando l'SM ha 48 HWcores? Come posso mantenere tutti i 48 core utilizzati al massimo quando lo scheduler sta lavorando in blocchi di 32? (Se il paragrafo precedente è vero, non sarebbe meglio se lo schedulatore emettesse lavoro in unità di dimensione HWcore?)
4) Sembra che lo schedulatore di warp accoda 2 attività alla volta. In modo che quando il kernel attualmente in esecuzione si blocca o blocchi, il secondo kernel viene scambiato. (Non è chiaro, ma suppongo che la coda qui sia più di 2 kernel profondi.) È corretto?
5) Se il mio HW ha un limite superiore di 512 thread per blocco (nThreadsMax), ciò non significa che il kernel con 512 thread funzionerà più velocemente su un blocco. (Anche in questo caso, mem non è un problema.) Ci sono buone probabilità di ottenere prestazioni migliori se diffondo il kernel a 512 thread su molti blocchi, non solo uno. Il blocco viene eseguito su uno o più SM. Vero?
5a) Penso che più piccolo è, meglio è, ma importa quanto piccolo faccio nBlocks
? La domanda è, come scegliere il valore di nBlocks
che è decente? (Non necessariamente ottimale.) Esiste un approccio matematico alla scelta di nBlocks
o semplicemente trial-n-err.
Questa GPU ha 192 CudaCore. Sarebbero 4 SM, con 48 core hardware (HWcores). 4 * 48 = 192 – Doug