关于共享内存的使用

各位大神好!
已知我电脑的GPU的Total amount of shared memory per block是49152 bytes,
可是我申请共享内存变量
shared Complex adjust[990*10];(typedef float2 Complex; )
的时候报错
错误 1 fatal error LNK1181: 无法打开输入文件“.\x64\Debug\system.cu.obj”

当我把990改成小于200时,就不会报错。
可是990104=39600<49152呀(sizeof(Complex)=4),这到底是为什么?共享内存最大能申请多少?
谢谢!

楼主您好。

您的sizeof(Complex) 是8.而不是4.

所以 990 * 10 * 8 = ~80KB

谢谢!
但是理论上应该可以支持到60010的矩阵啊,
为什么只能申请200
10呢?
我还申请了一个 shared Complex sigcol[10];
应该没什么影响。

此外,还需要说一下,我记得分配超了会导致运行错误,而不是编译错误。

楼主你你可能还有其他会导致问题的地方,而不是分配过多。(因为这个编译时刻不会报错)。

理论的确如此。你将大小改为大于200 * 10后,出错。可能还有别的原因。我建议你看下log。

如下方式可以看build log(默认看不到):

(1)从VS的debug菜单, 选择“option and settings"。
(2)从option and setttings菜单点击后的弹出项里,展开“Projects and solutions"
(3)在projects and solutions的展开项里,选择"build and run"
(4)将右侧倒数第二行的build output verbosity,改成"detailed"

执行一次build. 将屏幕下方的build窗口输出复制过来。这样我们可以通过看你的build log,知道你为何究竟>200就会出错。而不一定是你想象的过大。实际上我不认为过大会此时报错。

请问版主
您知道这个错误
fatal error LNK1181: 无法打开输入文件“.\x64\Debug\system.cu.obj”
一般是由什么问题造成的?

这个错误:

你的形式如a.cu.obj找不到,是由于,a.cu未能成功编译出a.cu.obj来。

而具体导致未能成功编译的原因,需要从log里看到详细信息。

如何看到详细信息,你可以参考下5#我的建议。

版主您好!
我build之后出现这样的信息
ptxas error : Entry function ‘_Z12RelateKernelPK6float2S1_PS_iii’ uses too much shared data (0xbbf8 bytes + 0x10 bytes system, 0x4000 max)
这是什么意思?感觉无法理解。。

(1)感谢你即使反馈build信息。
根据这个信息。那果然提示超了。我记得不会对过多的shared memory使用报错的。看来这个记忆是错误的。

(2)我解说一下,
entry function在ptxas提示里,指的是__global__。(ptx里.entry是__global__, .func是普通__device__函数,你这个大致知道,能看懂提示即可)。

以及这个提示,的确是提示你用超了。

以及,在这个提示你,我看到了+0x10 bytes system. 这个在2.x/3.x里应该不存在,因为他们不需要shared memory传递参数的。以及,0x4000 max应该也是1.x。(1.x只有16KB).

那么你可以如下解决:
在您的.cu上点击右键,选择CUDA C/C++里的device项目,在右侧的code generation里输入:
compute_20,sm_20 (如果你是2.0的卡)
或者compute_20,sm_21 (如果你是2.1的卡)

2.x应该支持48KB最大的shared. (0xc000)

以及,再说一下,默认的设置是compute_10,sm_10, 而这个只能支持16KB的。所以你需要修改。

以及,如果你就是compute_20,sm_20这样的,
但依然报错16KB(编译时刻),那么我就不知道了。那就将奇怪了。

不过我估计修改compute_20,sm_20之类的会有帮助。:slight_smile:

版主大神!
我有一个弱弱的问题。
“在您的.cu上点击右键,选择CUDA C/C++里的device项目,在右侧的code generation里输入:
compute_20,sm_20 (如果你是2.0的卡)
或者compute_20,sm_21 (如果你是2.1的卡)”
我怎么找不到修改compute_20,sm_20的地方??我用的是VS2008。

楼主您可以看附件里的图。(Visual Studio 2010)。

如果您VS不是2010版本,请让ICE发一下2008的图。略微有区别。

图1

回复完了才发现您是08,请等待ICE版主发2008的图。(大约需要5-10分钟)

你可以试试在项目名称——右键属性——配置属性——CUDA Runtime API——GPU——右边GPU Architecture里面选为您的GPU的架构,sm_2.0,sm_2.1什么的,如果有sm_1.x的项,可以选为0清除掉。

然后确定,再编译。
(稍等下,我去截图)
-----------------------------------------截图归来的分割线------------------------------------------

[attach]2978[/attach]

哇,终于通过了,激动不已!!
感谢千军版主的耐心解答,感谢ice版主的热情参与,灰常感谢!!!

ice版主,不用您辛苦了,问题解决了,谢谢!!

这个其实我们绕弯路了。我以为你已经设置了,然后要求你发的build log, 结果一看,还真是需要设置一下。。

以及,也感谢楼主,能及时按要求发送了log。谢谢配合。您看,这对您也有利,快速解决问题。:slight_smile:

恩恩,看来学习CUDA路漫漫啊!向版主学习!

恭喜LZ解决问题,和LZ共勉!

(14#的截图已经补了,大图一枚,请后来参考本帖的人点开看。)

善哉。

我也和楼主共勉,共同进步吧。

感谢ICE的图。