2011-01-20 111 views
0

儘管沒有超出可用內存,是否對設備內存分配有任何限制?根據cuMemGetInfo有超過200MB左cudaMalloc和「內存不足」問題

cudaSafeCall() Runtime API error : out of memory. 

然而,: 我在嘗試分配64MB後,下面的錯誤。

下面是場景:

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 

更新:

此行爲是相當不確定的。時不時會成功,我得到正確的結果,沒有任何錯誤。

+1

內存碎片?你可以分配兩個32 MB的塊,或四個16 MB的塊,或...? – Thomas 2011-01-20 17:24:11

+0

你可能是對的先生。我能夠達到分配300 * 1MB塊的8MB空閒內存。請將您的評論轉換爲答案,以便我可以接受它。 – Kylo 2011-01-20 19:01:10

回答

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; 
+0

沒有變化:-(但我注意到了新的症狀(問題已更新)。 – Kylo 2011-01-20 18:46:07

1

您似乎正在重新分配相同的內存,因爲您正在重新使用tmp。如果您習慣了面向對象的代碼,那麼您可能會錯誤地將指針與對象的引用相混淆。

下面的代碼應該給你同樣的結果:

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