我使用的是 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.
默认情况下,Fermi 卡以兼容模式运行,每个多处理器具有 16kb 共享内存和 48kb L1 缓存。如果您需要,API 调用
cudaThreadSetCacheConfig
可用于将 GPU 更改为使用 48kb 共享内存和 16kb L1 缓存运行。然后,您必须编译计算能力 2.0 的代码,以避免您看到的代码生成错误。
此外,您的 Telsa C2050 确实 支持双精度。如果您收到有关降级双打的编译器警告,则意味着您没有为正确的体系结构编译代码。添加
--arch=sm_20
您的
nvcc
参数和 GPU 工具链将为您的 Fermi 卡编译,并将包括双精度支持和其他 Fermi 特定硬件功能,包括更大的共享内存大小。
据我所知,Cuda 3.0 支持计算 2.0。 我将 VS 2010 与 CUDA 4.1 一起使用。所以我假设 VS 2008 应该也有些相似。右键单击项目并选择属性-> Cuda C/C++ -> 设备 -> 代码生成。将其更改为 compute_10,sm_10;compute_20,sm_20