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

时间:2012-01-29 10:09:51

标签: cuda shared-memory nvidia

我正在使用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 toolkit 3.0

2 个答案:

答案 0 :(得分:2)

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

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

--arch=sm_20

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

答案 1 :(得分:0)

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