2011-01-20 7 views
0

使用可能なメモリを超えていないにもかかわらず、デバイスメモリの割り当てに制限はありますか? 私は64メガバイトを割り当てることを試した後、エラーを以下の取得:cudaMallocと「メモリ不足」エラーの問題

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 

更新:

この動作は非常に非決定的です。場合によっては上記のケースが成功し、何のエラーもなく正しい結果が得られます。

+1

メモリの断片化? 32 MBの2つのブロック、または16 MBの4つのブロックを割り当てることができますか? – Thomas

+0

あなたはおそらく正しいでしょう。私は8MBの空きメモリを300 * 1MBのブロックに割り当てることができました。私はそれを受け入れることができるようにあなたのコメントを答えに変換してください。 – Kylo

答えて

2

です。 (実験で確認しました。信頼できるリンク元が見つかりませんでした)

0

同じメモリポインタを使用してメモリを2回割り当てています。最初のメモリ割り当てアドレスをバックアップするのに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

1

tmpを再利用しているのと同じメモリを再割り当てしているようです。オブジェクト指向のコードに慣れている場合は、ポインタをオブジェクトへの参照と間違えている可能性があります。

次のコードは、あなたに同じ結果を与える必要があります:トーマスが指摘したように、問題はメモリの断片化は

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

はい、同じ結果だが、私はあなたが '同じメモリを再割り当てする'ことを理解していない。 – Kylo