3

Cuda 4.0を搭載したUbuntu 10.10 システムNVIDIA GTX 570グラフィックス カードを実行しています。

パフォーマンスのためには、メモリに効率的にアクセスし、デバイス上のレジスタ共有メモリを賢く使用する必要があることはわかっています。

ただし、計算方法、スレッドごとに使用可能なレジスタの数、単一のブロックで使用できる共有メモリの量、および特定のカーネル構成に対するその他の単純/重要な計算を理解していません。

明確な例でこれを理解したいと思います。ちなみに、私は現在、カーネルの 1 つがこのように見える粒子コードを書こうとしています。

各ブロックはスレッドの1 次元コレクションであり、各グリッドはブロックの1 次元コレクションです。

  • ブロック数 : 16384
  • ブロックあたりのスレッド数: 32 ( => 合計スレッド 32*16384 = 524288 )
  • スレッド ブロックには、使用する共有メモリの32 x 32 の 2 次元整数配列が与えられます。

スレッド内に type のいくつかの数値を保存したいと思いますdouble。しかしdouble、レジスターがローカルメモリー (デバイス上) に流出することなく、そのような数値をいくつ保存できるかはわかりません。このカーネル構成のスレッドごとにいくつの double を格納できるか教えてもらえますか?

また、各ブロックの共有メモリの上記の構成は有効ですか?

これらのことをどのように推測するかについてのサンプル計算は、非常に説明的で役立つでしょう

これが私の GTX 570 に関する情報です: (CUDA-SDK の deviceQuery を使用)

[deviceQuery] starting...
./deviceQuery Starting...

 CUDA Device Query (Runtime API) version (CUDART static linking)

Found 1 CUDA Capable device(s)

    Device 0: "GeForce GTX 570"
      CUDA Driver Version / Runtime Version          4.0 / 4.0
      CUDA Capability Major/Minor version number:    2.0
      Total amount of global memory:                 1279 MBytes (1341325312 bytes)
      (15) Multiprocessors x (32) CUDA Cores/MP:     480 CUDA Cores
      GPU Clock Speed:                               1.46 GHz
      Memory Clock rate:                             1900.00 Mhz
      Memory Bus Width:                              320-bit
      L2 Cache Size:                                 655360 bytes
      Max Texture Dimension Size (x,y,z)             1D=(65536), 2D=(65536,65535), 3D=(2048,2048,2048)
      Max Layered Texture Size (dim) x layers        1D=(16384) x 2048, 2D=(16384,16384) x 2048
      Total amount of constant memory:               65536 bytes
      Total amount of shared memory per block:       49152 bytes
      Total number of registers available per block: 32768
      Warp size:                                     32
      Maximum number of threads per block:           1024
      Maximum sizes of each dimension of a block:    1024 x 1024 x 64
      Maximum sizes of each dimension of a grid:     65535 x 65535 x 65535
      Maximum memory pitch:                          2147483647 bytes
      Texture alignment:                             512 bytes
      Concurrent copy and execution:                 Yes with 1 copy engine(s)
      Run time limit on kernels:                     Yes
      Integrated GPU sharing Host Memory:            No
      Support host page-locked memory mapping:       Yes
      Concurrent kernel execution:                   Yes
      Alignment requirement for Surfaces:            Yes
      Device has ECC support enabled:                No
      Device is using TCC driver mode:               No
      Device supports Unified Addressing (UVA):      Yes
      Device PCI Bus ID / PCI location ID:           2 / 0
      Compute Mode:
         < Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) >

    deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 4.0, CUDA Runtime Version = 4.0, NumDevs = 1, Device = GeForce GTX 570
    [deviceQuery] test results...
    PASSED

    Press ENTER to exit...
4

1 に答える 1

1

そのため、カーネル構成は少し複雑です。CUDA OCCUPANCY CALCULATORを使用する必要があります. 一方で、ワープがどのように機能するかを研究する必要があります。ブロックが SM に割り当てられると、ワープと呼ばれる 32 のスレッド単位にさらに分割されます。ワープは、SM におけるスレッド スケジューリングの単位であると言えます。特定のブロック サイズと各 SM に割り当てられた特定の数のブロックについて、SM に存在するワープの数を計算できます。あなたの場合、ワープは 32 スレッドで構成されているため、256 スレッドのブロックがある場合、ワープは 8 になります。ここで、適切なカーネル設定の選択は、データと操作によって異なります。SM を完全に占有する必要があることを覚えておいてください。つまり、各 SM で完全なスレッド容量を取得し、待ち時間の長い操作をスケジュールするためのワープの最大数を取得する必要があります。 . もう1つの重要なことは、ブロックあたりの最大スレッド数の制限を超えないことです.あなたの場合は1024です.

于 2012-09-12T02:26:07.820 に答える