繁体   English   中英

如果我使用共享内存,可以分配多少块?

[英]How many blocks can be allocated if i use shared memory?

我是Cuda编程的新手。 我可以使用设备“ Tesla K10”。 我正在处理一个复杂的问题 ,每个问题实例大约需要20 KB的内存。 现在,由于cuda提供了并行化,我决定每个块使用96个线程(牢记扭曲)来解决问题的一个实例。 现在的问题是我有很多这样的问题需要解决(比如说超过1,600,000)。 我知道,如此大的内存需求甚至无法适应全局内存(在我的情况下为3.5 GB,如下面的DeviceQuery输出所示),因此我必须一次解决几个问题。

此外,我已将每个问题与每个块进行映射以解决问题的一个实例。

现在,我现在能够解决全局存储器中数据的大量问题。 但是共享内存比全局内存快,因此我计划使用20 KB(每个问题)共享内存。

1)现在我的困惑是,这一次将只允许我在共享内存中加载两个要解决的问题(即40KB <48 KB共享内存)。 (基于我对cuda的理解,如果我不满意,请指正我)。

2)如果我在内核中声明了具有此20 KB的数组,这是否意味着这个(20 KB * number_of_blocks)将被共享内存使用? 我说的number_of_blocks是要解决的问题数。 我的启动配置有问题<>>(...)

您在这方面的所有帮助将得到高度认可。 预先感谢您。

***My partial Device Query***

Device : "Tesla K10.G1.8GB"
  CUDA Driver Version / Runtime Version          6.5 / 5.0
  CUDA Capability Major/Minor version number:    3.0
  Total amount of global memory:                 3584 MBytes (3757637632 bytes)
  ( 8) Multiprocessors, (192) CUDA Cores/MP:     1536 CUDA Cores
  GPU Clock rate:                                745 MHz (0.75 GHz)
  Memory Clock rate:                             524 Mhz
  Memory Bus Width:                              2048-bit
  L2 Cache Size:                                 4204060 bytes
  Maximum Texture Dimension Size (x,y,z)         1D=(65536), 2D=(65536, 65536), 3D=(4096, 4096, 4096)
  Maximum Layered 1D Texture Size, (num) layers  1D=(16384), 2048 layers
  Maximum Layered 2D Texture Size, (num) layers  2D=(16384, 2046), 65536 layers
  Total amount of constant memory:               65536 bytes
  **Total amount of shared memory per block:       49152 bytes**
  Total number of registers available per block: 65536
  Warp size:                                     32
  Maximum number of threads per multiprocessor:  0
  Maximum number of threads per block:           1024
  Max dimension size of a thread block (x,y,z): (1024, 1024, 64)
  Max dimension size of a grid size    (x,y,z): (2147483647, 65535, 65535)
  Maximum memory pitch:                          2147483647 bytes
...

首先,快速总结一下我是否正确理解:

  • 您需要解决约150万个问题,这些问题是完全独立的,即令人尴尬的并行
  • 每个问题的数据集约为20 KB

解决整个问题将需要大于30 GB的内存,因此很显然,您需要将问题集分成批处理。 使用您的4 GB卡(〜3.5 GB可用于ECC等),您随时可以容纳大约150,000个问题。 如果要对它们进行双缓冲,以允许同时传输下一个批次与当前批次的计算,那么您正在研究的是一个批次中的75K问题(如果需要用于输出的空间,则可能更少)。

首先要考虑的是您是否可以并行处理每个问题,即是否可以将多个线程分配给一个问题? 如果是这样,那么您应该考虑分配一个线程块来解决一个单独的问题,使用共享内存可能值得考虑,尽管您可能会将占用率限制为每个SM两个块,这可能会损害性能。

如果您无法在问题中并行化,那么您就不应该考虑共享内存,因为正如您所说,您将自己限制为每个SM两个线程(从根本上消除了GPU计算的好处)。 相反,您需要确保全局内存中的数据布局能够实现合并访问-这很可能意味着使用SoA(数组结构)布局而不是AoS(结构数组)。

您的第二个问题有些令人困惑,尚不清楚您是在GPU上下文中还是在问题上下文中表示“阻塞”。 但是从根本上说,如果您在内核代码中声明一个20 KB的__shared__数组,则该数组将在每个块中分配一次,并且每个块将具有相同的基地址。

根据OP的评论进行更新

GPU包含许多SM,每个SM都有一个较小的物理内存,可用于L1和共享内存。 在您的情况下,对于K10,每个SM都有48 KB可用作为共享内存,这意味着在SM上执行的所有块在任何时候都可以使用多达48 KB的内存。 由于每个块需要20 KB,因此您可以随时在SM上最多执行两个块。 这并不影响您可以在启动配置中设置多少个块,而仅影响它们的调度方式。 这个答案讨论的内容更为详细(尽管对于每个SM 16 KB的设备而言), 这个(很旧的)答案的解释要多一些,尽管最有用(最新)的信息在CUDA教育中页数

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM