线程中用malloc和free进行全局显存分配和释放。
是不是不能malloc一段比较长的显存。
我分配64个double型变量,并进行初始化时就出错。但只分配,不操作则没有错。
分配49个double型变量时就没有问题。
请问这可能是什么原因造成的?我用的是GTX660。但在我笔记本的NVS4200M上就可以。
kernel里面的malloc容量有限制的,以及可以修改默认的容量限制。
具体修改方式请您查一下programming guide里面的叙述或者翻一下老帖也行。
但是该限制即便是默认值,也远比64个double变量(64*8B=512B)大的,以及没有理由GTX660不行而NVS4200M却可以,前者的计算能力版本要高于后者的,具备后者的所有特性,限制只可能更少。
所以,建议您检查下您的代码,看具体是什么问题。
您也可以考虑贴出您的代码段以及错误信息。
祝您好运~
今天排查了一下原因。用cudaDeviceSetLimit增大Heep之后就行了。
可能gtx660中SMX有5个,还可能有active block,而NVS4200m中只有一个SMX,active block也会较少。
可能就是这个原因吧。
我不认为ICE的说法有错误。
在当前的驱动下(320.x)和cuda 5.0下, 你的卡的默认有8MB的heap size供你的kernel内的malloc用的。
按理说你分配512B无压力的。除非你的1#撒谎了,你试图分配更多,导致实际问题和你的描述不符合,而导致ICE无法给出正确回复。
以及,这个和你的SM有5个还是50个无关的。请以后读帖的人注意这点(请忘记rono_back的后半段,malloc的设备端调用只和该系统调用使用的设备端heap大小有关,而和有几个SM无关,特此更正)。
以及,这个和你给出的SMX有几个无关的。
both都是cuda4.2
gtx660
一个block中49线程,一个线程三次用malloc(49sizeof(double))并对其操作,可以
一个block中64线程,一个线程三次用malloc(64sizeof(double))并对其操作,不可以
NVS4200m
一个block中49线程,一个线程三次用malloc(49sizeof(double))并对其操作,可以
一个block中64线程,一个线程三次用malloc(64sizeof(double))并对其操作,可以
在gtx660中将heep改成20MB时
一个block中49线程,一个线程三次用malloc(49sizeof(double))并对其操作,可以
一个block中64线程,一个线程三次用malloc(64sizeof(double))并对其操作,可以
我们的讨论只是在您给出的前提的基础上的!
如果您将原来的“单个线程中的分配”改成了“64个线程”,然后将一次分配改成了“三次分配”。
您觉得这个厚道么?
您觉得真还是我们原来讨论的问题么?
互相思考下吧。