尽管没有超过可用内存,是否存在分配设备内存的限制? 尝试分配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
更新
这种行为非常不确定。不时上面的案例成功,我得到了正确的结果,没有任何错误。
答案 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;