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

输入函数使用了过多的共享数据(0x8020字节和0x10字节系统,0x4000最大)-CUDA错误,cuda,shared-memory,nvidia,Cuda,Shared Memory,Nvidia,我使用的是特斯拉C2050,它的计算能力为2.0,共享内存48KB。但是当我试图使用这个共享内存时,nvcc编译器给了我以下错误 Entry function '_Z4SAT3PhPdii' uses too much shared data (0x8020 bytes + 0x10 bytes system, 0x4000 max) 我的SAT1是扫描算法的简单实现,因为我操作的是顺序为4096x2160的图像大小,所以我必须使用double来计算累积和。尽管特斯拉C2050不支持doubl

我使用的是特斯拉C2050,它的计算能力为2.0,共享内存
48KB
。但是当我试图使用这个共享内存时,
nvcc
编译器给了我以下错误

Entry function '_Z4SAT3PhPdii' uses too much shared data (0x8020 bytes + 0x10 bytes system, 0x4000 max)
我的SAT1是扫描算法的简单实现,因为我操作的是顺序为
4096x2160
的图像大小,所以我必须使用double来计算累积和。尽管特斯拉C2050不支持double,但它通过将其降级为float来完成任务。但对于4096的图像宽度,共享内存大小大于16KB,但在48KB的限制范围内


有人能帮我了解这里发生了什么吗。我使用的是CUDA toolkit 3.0,默认情况下,Fermi卡以兼容模式运行,每个多处理器有16kb的共享内存和48kb的一级缓存。如果需要,可以使用API调用cudaThreadSetCacheConfig将GPU更改为使用48kb共享内存和16kb一级缓存运行。然后必须编译ComputeCapability 2.0的代码,以避免出现代码生成错误

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

--arch=sm_20

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

据我所知,Cuda 3.0支持compute 2.0。
我使用VS2010和CUDA 4.1。所以我假设VS2008也应该是类似的。右键单击项目并选择properties->Cuda C/C++->Device->Code generation。将其更改为compute_10,sm_10;compute_20,sm_20

非常感谢您的回答,但我已经完成了
cudaThreadSetCacheConfig
,并给出了这个选项
cudaFuncCachePreferShared
,以将共享内存设置为48KB,但仍然显示了一个错误。还有其他原因吗?我使用的是VisualStudio2008,在选项中它只显示sm_10到sm_13,但不显示更多。正如您所说,它是在兼容模式下工作的,有没有一种方法可以使系统范围内的更改在较新的体系结构中运行?感谢您必须为费米体系结构进行编译,否则您将无法生成代码。我不使用VisualStudio,所以恐怕我无法帮助您。您正在为项目使用旧的生成规则。更新至CUDA 3.2或4.x。您必须修改的选项位于Project Properties->CUDA运行时API->GPU->GPU架构(x)至sm中_20@brano:我们使用CUDA vs wizard来集成CUDA规则,这可能是它在兼容模式下工作的原因吗?我们尝试了加入Cuda.rules的正常方式,但没有成功。有什么提示或链接我可以通过吗?我的建议是更新/安装最新的CUDA 4.1。您需要安装驱动程序和CUDA工具包。之后,您将右键单击VS中的项目并按“自定义构建规则”,然后选择CUDA 4.1的运行时API构建规则。