cudaMalloc和“内存不足”错误的问题

时间:2011-01-20 17:14:42

标签: c++ cuda

尽管没有超过可用内存,是否存在分配设备内存的限制? 尝试分配64MB后出现以下错误:

cudaSafeCall() Runtime API error : out of memory.

然而,根据 cuMemGetInfo ,还剩下超过200MB。

这是一个场景:

size_t size = 4096 * 4096 * sizeof (float);
cuMemGetInfo(&fr, &ttl); // fr indicates 284 MB
cutilSafeCall(cudaMalloc((void**) &tmp, size));
p1 = tmp;
cuMemGetInfo(&fr, &ttl); // fr indicates 220 MB
cutilSafeCall(cudaMalloc((void**) &tmp, size)); // this fails !!!
p2 = tmp;

我错过了什么?

我正在使用:

Cuda compilation tools, release 3.2, V0.2.1221
NVidia Driver 260.19.26
Linux(Slackware) x86

更新

这种行为非常不确定。不时上面的案例成功,我得到了正确的结果,没有任何错误。

3 个答案:

答案 0 :(得分:2)

托马斯指出问题是内存碎片化。 (通过实验证实。我找不到可靠的链接来源)

答案 1 :(得分:1)

您似乎正在重新分配相同的内存,因为您正在重用tmp。如果您习惯于面向对象的代码,则可能会将指针误认为是对象的引用。

以下代码应该会给您相同的结果:

size_t size = 4096 * 4096 * sizeof(float);
float* p1;
float* p2;
cutilSafeCall(cudaMalloc((void**) &p1, size));
cutilSafeCall(cudaMalloc((void**) &p2, size));

答案 2 :(得分:0)

您正在使用相同的内存指针来分配内存两次。我知道您使用 p1 来备份第一个内存分配地址,但之后您忘记清除 tmp 。也许cudaMalloc()因此而失败。这只是一个疯狂的猜测。

size_t size = 4096 * 4096 * sizeof (float);
cuMemGetInfo(&fr, &ttl); 
cutilSafeCall(cudaMalloc((void**) &tmp, size));
p1 = tmp;
tmp = 0; // or NULL to clear the pointer
cuMemGetInfo(&fr, &ttl); 
cutilSafeCall(cudaMalloc((void**) &tmp, size));
p2 = tmp;