入口函数使用了过多的共享数据(0x8020 字节 + 0x10 字节系统,最大 0x4000)- CUDA 错误

问题描述 投票:0回答:2

我使用的是 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
不支持 double,但它仍然通过将其降级为浮动来完成任务。但是对于 4096 的图像宽度,共享内存的大小要大 16KB,但它完全在 48KB 的限制内。

任何人都可以帮助我了解这里发生的事情。我正在使用 CUDA 工具包 3.0.

cuda nvidia gpu-shared-memory
2个回答
2
投票

默认情况下,Fermi 卡以兼容模式运行,每个多处理器具有 16kb 共享内存和 48kb L1 缓存。如果您需要,API 调用

cudaThreadSetCacheConfig
可用于将 GPU 更改为使用 48kb 共享内存和 16kb L1 缓存运行。然后,您必须编译计算能力 2.0 的代码,以避免您看到的代码生成错误。

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

--arch=sm_20

您的

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.