2013-07-23 1 views
5

2台のNvidia Quadro FX 5800カードを搭載したワークステーションがあります。 deviceQuery CUDAサンプルを実行すると、マルチプロセッサ(SM)あたりの最大スレッド数は1024であり、ブロックあたりの最大スレッド数は512です。CUDA:マルチプロセッサあたりのスレッドとブロックごとのスレッドの区別は何ですか?

一度に1つのブロックしか各SMで実行できないとすると、 /プロセッサは最大スレッド/ブロックを2倍にしますか? SMごとに他の512スレッドをどのように利用すればよいですか?

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) > 

乾杯、 ジェームズ。唯一つのブロックが一度に各SM上で実行することができることを考えると

+4

「一度に1つのブロックしか各SMで実行できない」というステートメントは正しくありません。それを取るとそれは完璧な意味があります。これは何百万回も前に尋ねられています。一度見つけたら、私はこれを複製物として捉えて投票します。 – talonmies

答えて

18

この文は根本的に間違っています。リソースの競合を回避し、カーネル(すなわち、グリッド)内に十分なスレッドブロックを仮定すると、SMは一般にそれに割り当てられた複数のスレッドブロックを有する。

実行の基本単位は、ワープです。ワープは、命令サイクルごとにSMによってロックステップで一緒に実行される32スレッドで構成されます。

したがって、単一のスレッドブロック内であっても、SMには通常、「飛行中」のワープ以上のワープがあります。マシンがレイテンシを隠すことができるようにするには、これは優れたパフォーマンスにとって不可欠です。

同じスレッドブロックからのワープを実行するか、別のスレッドブロックからワープするかは概念的に違いはありません。 SMは、それらに常駐する複数のスレッドブロック(すなわち、常駐スレッドブロックに割り当てられたレジスタおよび共有メモリなどのリソースを有する)を有することができ、ワープスケジューラは、すべての常駐スレッドブロック内のすべてのワープの中から、任意の命令サイクル。

したがって、スレッドが最大限スレッド(この場合は512)で構成されていても、1つ以上のブロックをサポートできるため、SMはより多くのスレッドを持つことができます。複数のスレッドブロックを常駐させることで、スレッドブロックの制限を超えて利用します。

占有率の考え方をGPUプログラムで調べることもできます。

+0

ああ、私が間違っていたこと!ロバートの質問にお返事いただきありがとうございます。 –