【问题标题】:Entry function uses too much shared data (0x8020 bytes + 0x10 bytes system, 0x4000 max) - CUDA error入口函数使用太多共享数据(0x8020 字节 + 0x10 字节系统,最大 0x4000) - CUDA 错误
【发布时间】:2012-01-29 10:09:50
【问题描述】:

我正在使用 Tesla C2050,它具有 2.0 的计算能力并具有共享内存 48KB。但是当我尝试使用这个共享内存时,nvcc 编译器给了我以下错误

Entry function '_Z4SAT3PhPdii' uses too much shared data (0x8020 bytes + 0x10 bytes system, 0x4000 max)

我的 SAT1 是扫描算法的幼稚实现,并且因为我正在处理 4096x2160 顺序的图像大小,所以我必须使用 double 来计算累积和。尽管Tesla C2050 不支持双精度,但它仍然通过将其降级为浮动来完成任务。但是对于 4096 的图像宽度,共享内存大小要大于 16KB,但在 48KB 的限制范围内。

谁能帮我理解这里发生了什么。我正在使用 CUDA 工具包 3.0

【问题讨论】:

    标签: cuda shared-memory nvidia


    【解决方案1】:

    默认情况下,Fermi 卡以兼容模式运行,每个多处理器具有 16kb 共享内存和 48kb L1 高速缓存。如果需要,可以使用 API 调用 cudaThreadSetCacheConfig 将 GPU 更改为使用 48kb 共享内存和 16kb L1 缓存运行。然后,您必须为计算能力 2.0 编译代码以避免您看到的代码生成错误。

    此外,您的 Telsa C2050 确实支持双精度。如果您收到有关降级双精度的编译器警告,这意味着您没有为正确的体系结构编译代码。添加

    --arch=sm_20
    

    到您的nvcc 参数,GPU 工具链将为您的 Fermi 卡编译,并将包括双精度支持和其他 Fermi 特定硬件功能,包括更大的共享内存大小。

    【讨论】:

    • 非常感谢您的回答,但我已经完成了cudaThreadSetCacheConfig 并提供了此选项cudaFuncCachePreferShared 以将共享内存设置为48KB,但仍然显示错误。会不会有别的原因?我使用的是 Visual Studio 2008,在选项中它只显示 sm_10 到 sm_13,但没有进一步显示。正如您所说,它在兼容模式下工作,有没有办法可以进行系统范围的更改以在较新的架构中运行?谢谢
    • 您将不得不为 Fermi 架构进行编译,否则您将无法构建代码。我不使用 Visual Studio,所以恐怕我无能为力。
    • 您正在为项目使用旧的构建规则。更新到 CUDA 3.2 或 4.x。您必须修改的选项在 Project Properties -> CUDA Runtime API -> GPU -> GPU Architecture(x) to sm_20
    • @brano:我们已经使用 CUDA vs 向导来集成 CUDA 规则,这可能是它工作兼容模式的可能原因吗?我们尝试了包含 Cuda.rules 的正常方式,但没有奏效。我可以通过任何提示或链接吗?
    • 我的建议是更新/安装最新的 CUDA 4.1。 developer.nvidia.com/cuda-toolkit-41。您将需要安装驱动程序和 CUDA 工具包。之后,您将右键单击 VS 中的项目并按“自定义构建规则”并选择 CUDA 4.1 的运行时 API 构建规则。
    【解决方案2】:

    据我所知,Cuda 3.0 支持计算 2.0。 我将 VS 2010 与 CUDA 4.1 一起使用。所以我假设 VS 2008 也应该有点相似。右键单击项目并选择属性-> Cuda C/C++ -> 设备-> 代码生成。改成compute_10,sm_10;compute_20,sm_20

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-02
      • 1970-01-01
      • 2014-03-21
      • 2012-09-13
      • 2014-05-04
      • 2021-07-16
      • 2013-04-28
      • 1970-01-01
      相关资源
      最近更新 更多