了解CUDA中的内存使用情况

时间:2012-09-12 01:36:20

标签: memory memory-management cuda

我在 Ubuntu 10.10系统 上运行 NVIDIA GTX 570 显卡 < em> Cuda 4.0。

我知道,为了提高性能,我们需要高效地访问内存,并巧妙地在设备上使用注册共享内存。

但是我不明白如何计算,每个线程可用的寄存器数量,或单个块可以使用多少共享内存以及特定内核配置的其他此类简单/重要计算。

我希望通过 显式 示例来理解这一点。 顺便说一句,我目前正在尝试编写一个粒子代码,其中一个内核应该是这样的。

每个块都是 1-D 线程集合,每个网格都是 1-D 块集合。

  • 块数: 16384
  • 每个块的线程数: 32 (=&gt;总线程数32 * 16384 = 524288
  • 每个线程块都有一个 32 x 32 共享内存的二维整数数组  与...合作。

在一个帖子中,我想存储一些类型为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...

1 个答案:

答案 0 :(得分:1)

因此,内核配置有点复杂。您应该使用CUDA OCCUPANCY CALCULATOR。另一方面,你必须研究warp如何工作。一旦将块分配给SM,它就被进一步划分为称为warps的32线程单元。我们可以说warp是SM中线程调度的一个单元。我们可以计算给定块大小的SM中的warp数以及分配给每个SM的给定块数。在你的情况下,warp包含32个线程,所以如果你有一个256线程的块,那么你有8个warp。现在选择正确的内核设置取决于您的数据和操作,请记住您必须完全占用SM,即:您必须获得每个SM中的完整线程容量以及围绕长延迟操作调度的最大warp数。另一个重要的事情是不要超过每块最大线程数的限制,在你的情况下为1024。