2013-07-23 35 views
5

Mamy stację roboczą z dwiema zainstalowanymi kartami Nvidia Quadro FX 5800. Uruchomienie próbki urządzenia CUDA deviceQuery ujawniło, że maksymalna liczba wątków na multiprocesor (SM) wynosi 1024, a maksymalna liczba wątków na blok wynosi 512.CUDA: Jakie są wątki na multiprocesor i wątki na rozróżnienie bloku?

Biorąc pod uwagę, że tylko jeden blok może być wykonany na każdym SM na raz, dlaczego jest to maksymalna liczba wątków/procesor podwaja maksymalną liczbę wątków/bloków? W jaki sposób wykorzystujemy pozostałe 512 wątków na 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) > 

Pozdrawiam, James.

+4

Instrukcja "Biorąc pod uwagę, że tylko jeden blok może być wykonany na każdym SM za jednym razem" jest niepoprawny. Zabierz to i ma to sens. Zostało to zadane milion razy wcześniej. Gdy znajdę jedną, zagłosuję, aby ją sklasyfikować jako duplikat. – talonmies

Odpowiedz

18

Biorąc pod uwagę, że tylko jeden blok może być wykonany na każdej SM naraz,

To stwierdzenie jest fundamentalnie błędne. Blokując konflikty zasobów i zakładając wystarczającą liczbę blokad wątków w jądrze (to jest w siatce), na SM zwykle będzie przypisywanych wiele bloków wątków.

Podstawową jednostką wykonawczą jest osnowa. Osnowa składa się z 32 wątków, wykonanych razem w lockstep przez SM, w cyklu instrukcji według cyklu instrukcji.

Dlatego nawet w pojedynczym bloku wątkowym, SM będzie generalnie mieć więcej niż jedną osnowę "w locie". Jest to niezbędne, aby uzyskać dobrą wydajność, aby umożliwić urządzeniu ukrywanie opóźnień.

Nie ma żadnej konceptualnej różnicy między wyborem odkształceń z tego samego bloku gwintu do wykonania lub zakrzywieniami z różnych bloków gwintu. Moduły SM mogą mieć wiele bloków wątku rezydujących na nich (tj. Z zasobami takimi jak rejestry i pamięć współdzielona przypisanymi do każdego bloku wątków rezydentnych), a program szeregujący wątków wybierze spośród wszystkich osnów we wszystkich blokach wątków rezydentnych, aby wybrać następną osnowę do wykonania na dowolny cykl instrukcji.

Dlatego SM ma większą liczbę wątków, które mogą być "rezydentne", ponieważ może obsługiwać więcej niż jeden blok, nawet jeśli blok ten jest maksymalnie skonfigurowany z wątkami (w tym przypadku 512). Używamy więcej niż limit wątku, ponieważ ma wielu rezydentnych bloków.

Możesz także chcieć zbadać pomysł obłożenia w programach GPU.

+0

Ach, to tam się pomyliłem! Dziękuję za odpowiedź na pytanie Roberta. –