2013-07-23 11 views
5

Abbiamo una workstation con due schede Nvidia Quadro FX 5800 installate. Esecuzione del dispositivoQuery CUDA mostra che il numero massimo di thread per multiprocessore (SM) è 1024, mentre il numero massimo di thread per blocco è 512.CUDA: quali sono i thread per distinzione multiprocessore e thread per blocco?

Dato che su ogni SM può essere eseguito un solo blocco alla volta, perché i thread max sono/processore raddoppia il massimo thread/blocco? Come utilizziamo gli altri 512 thread per SM?

Device 1: "Quadro FX 5800" 
    CUDA Driver Version/Runtime Version   5.0/5.0 
    CUDA Capability Major/Minor version number: 1.3 
    Total amount of global memory:     4096 MBytes (4294770688 bytes) 
    (30) Multiprocessors x ( 8) CUDA Cores/MP: 240 CUDA Cores 
    GPU Clock rate:        1296 MHz (1.30 GHz) 
    Memory Clock rate:        800 Mhz 
    Memory Bus Width:        512-bit 
    Max Texture Dimension Size (x,y,z)    1D=(8192), 2D=(65536,32768), 3D=(2048,2048,2048) 
    Max Layered Texture Size (dim) x layers  1D=(8192) x 512, 2D=(8192,8192) x 512 
    Total amount of constant memory:    65536 bytes 
    Total amount of shared memory per block:  16384 bytes 
    Total number of registers available per block: 16384 
    Warp size:          32 
    Maximum number of threads per multiprocessor: 1024 
    Maximum number of threads per block:   512 
    Maximum sizes of each dimension of a block: 512 x 512 x 64 
    Maximum sizes of each dimension of a grid:  65535 x 65535 x 1 
    Maximum memory pitch:       2147483647 bytes 
    Texture alignment:        256 bytes 
    Concurrent copy and kernel execution:   Yes with 1 copy engine(s) 
    Run time limit on kernels:      No 
    Integrated GPU sharing Host Memory:   No 
    Support host page-locked memory mapping:  Yes 
    Alignment requirement for Surfaces:   Yes 
    Device has ECC support:      Disabled 
    Device supports Unified Addressing (UVA):  No 
    Device PCI Bus ID/PCI location ID:   4/0 
    Compute Mode: 
    < Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) > 

Cheers, James.

+4

L'istruzione "Dato che un solo blocco può essere eseguito su ogni SM alla volta" non è corretto. Portalo via e ha perfettamente senso. Questo è stato chiesto un milione di volte prima. Una volta trovato ne voterò per escluderlo come duplicato. – talonmies

risposta

18

Dato che un solo blocco può essere eseguito su ciascun SM alla volta,

Questa affermazione è fondamentalmente corretto. Escludendo i conflitti di risorse e assumendo un numero sufficiente di thread in un kernel (ad esempio la griglia), a un SM verrà generalmente assegnato più threadblock.

L'unità di base di esecuzione è l'ordito . Un ordito consiste di 32 thread, eseguiti insieme in un attimo da un SM, su un ciclo di istruzioni per ciclo di istruzioni.

Pertanto, anche all'interno di un singolo threadblock, un SM avrà generalmente più di un ordito "in volo". Questo è essenziale per una buona prestazione per consentire alla macchina di nascondere la latenza.

Non vi è alcuna differenza concettuale tra la scelta di warp dallo stesso threadblock da eseguire o la warping da diversi threadblock. Gli SM possono avere più threadblock residenti su di essi (cioè con risorse come registri e memoria condivisa assegnati a ciascun threadblock residente), e lo scheduler Warp sceglierà tra tutti gli orditi in tutti i thread-thread residenti, per selezionare il successivo ordito per l'esecuzione su qualsiasi dato ciclo di istruzioni.

Pertanto, l'SM ha un numero maggiore di thread che può essere "residente" perché può supportare più di un singolo blocco, anche se tale blocco è configurato al massimo con i thread (512, in questo caso). Utilizziamo più del limite del threadblock avendo più threadblock residenti.

Si potrebbe anche voler ricercare l'idea di occupazione in programmi GPU.

+0

Ah, questo è dove stavo sbagliando! Grazie per aver risposto alla domanda Robert. –