关于cuda5.5 share memory的问题

版主好,在自己写的cuda程序中出现下面错误
error : Entry function ‘_ZN14reconstruction18get_r_t_dev_globalEPNS_7zuobiaoES1_S1_PbPfS3_ff’ uses too much shared data (0x6030 bytes, 0x4000 max)
说我声明的share memory过大
就是下面这一句
shared float t_sum[thread_pre_block6];
其中thread_pre_block=1024,然后把他改成
shared float t_sum[thread_pre_block
3];
就不出错了,但我用的是GTX760,在cuda-z里面说我每个block的share memory 足足有48KiB,10246sizeof(float)=24KB而已,怎么可能过多呢??而且我之前用cuda5.0编译完全没问题的,是换成了5.5就提示出错了,怎么解决呢??

楼主您好:

您这不是CUDA 5.5的问题,而是编译参数发生了变化:
请看提示:“ 0x4000 max”
这表明您在使用默认的compute_10,sm_10进行编译,此时将只能支持最大16KB shared memory

解决方案:
(1)右键点击项目属性,选择CUDA C/C++
(2)在CUDA C/C++页面的Code Generation里,输入compute_30,sm_30
(3)rebuild all贵solution

感谢来访。

哦,那请问一下compute_10,sm_10是什么意思呢?compute_30,sm_30这代表什么,是不是换成这个之后就可以支持48KB的share memory了??

LZ您好:

这两组是不同的编译参数,前一组对应于计算能力1.0的硬件,后一组对应于计算能力3.0的硬件。
因为您的GPU是GTX760,是计算能力3.0的,所以如此建议。

如此设置可以解决您的烦恼,尽请一试。

祝您好运~

噢,谢谢,还有一问题,我写完了代码,在两台电脑跑过,一台是GT630只有96个CUDA核心,而且CPU也很差,只是双核,应该还是奔腾的(这不确定),另外一台是GTX760配英特尔的4770CPU i7的,而且程序的主体都是在CUDA里面算的耗时的步骤都是CUDA写的,但在差一点那台(gt630)跑出来平均要160ms,在GTX760这一台跑出来竟然要花费50ms只有不到四倍的提速这正常吗??

LZ您好:

应该说这种现象是可能的,以及具体造成这种现象的原因以及是否还有改进的余地,要具体问题具体分析。

1:一个基本的原则是,并行加速只能加速可以并行的部分,您全体程序中CPU写的部分是无法享受到GPU加速的(不过可以被更好的CPU加速)。

2:启动GPU运算以及初始化环境等有一些固有的开销,这些并不因为您GPU的升级而大幅度减少。

3:以及,这还和您的GPU端代码的具体写法和总体的计算量有关。

如果您有饱满的计算量,以及较能发挥出GPU效能的实现,那么单独比较GPU处理过程的时间,加速比例应该高出4倍不少。

大致如此,祝您好运~