【问题标题】:CUDA error: too much shared data (0x4018 bytes, 0x4000 max): where do the extra 0x18bytes come from?CUDA 错误:共享数据过多(0x4018 字节,最大 0x4000):额外的 0x18 字节从何而来?
【发布时间】:2016-10-21 05:38:15
【问题描述】:

我正在尝试实现这个 CUDA 示例: http://devblogs.nvidia.com/parallelforall/efficient-matrix-transpose-cuda-cc/ 因为我有 0x4000 字节可用,所以我尝试使用TILE_DIM = 128,这样

<strong>shared</strong> unsigned char tile[TILE_DIM][TILE_DIM];

大小为 0x4000 字节 = 16384 字节 = 128*128 字节。

但是,这给了我以下错误:

CUDACOMPILE : ptxas error : Entry function '_Z18transposeCoalescedPh' uses too much shared data (0x4018 bytes, 0x4000 max)

所以我在共享内存中有 0x18 (24) 个额外字节。它们来自哪里,是否可以移除它们?

我可以为 Compute 版本 2.0+ 更高版本进行编译以消除错误(我的硬件是 3.0 版),但这会使用 L1 缓存中的内存,这可能会更慢。

【问题讨论】:

  • 只有在为 sm_1x 架构编译时才会出现这种情况吗?
  • 不确定你的意思:“我可以为 Compute 版本 2.0+ 进行编译以消除错误(我的硬件是 3.0 版),但这会使用 L1 缓存中的内存。”

标签: c++ pointers cuda size


【解决方案1】:

所以我在共享内存中有 0x18 (24) 个额外字节。它们来自哪里,是否可以移除它们?

参考programming guide

一个块所需的共享内存总量等于静态分配的共享内存量、动态分配的共享内存量的总和,对于计算能力为 1.x 的设备,该数量用于传递内核参数的共享内存(请参阅__noinline____forceinline__)。

只要你为 cc1.x 架构编译,你将无法消除使用共享内存来承载内核参数。

我认为您已经指出的解决方案是针对 cc2.0 或 cc3.0 架构进行编译。不清楚你为什么不想这样做。

【讨论】:

  • 谢谢。在我的情况下,我将不得不看看如何减少 L1 缓存大小对性能的影响。
  • 如果编译为cc2.0或更高版本,参数应通过常量内存系统传递,不应影响共享内存使用。
  • 刚刚在 nVidia OpenCL 上遇到了类似的行为,只是缺少了 4 个字节。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-13
  • 2011-08-17
相关资源
最近更新 更多