2011-01-20 9 views
0

사용 가능한 메모리를 초과하지 않았지만 장치 메모리를 할당하는 데 대한 제한이 있습니까? 나는 64MB의 할당하려고 후 오류를 다음 얻을 :cudaMalloc 및 "메모리 부족"오류와 관련된 문제

cudaSafeCall() Runtime API error : out of memory. 

을하지만, cuMemGetInfo 200메가바이트 왼쪽 이상이에 따라.

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

+0

당신은 아마 맞을 것입니다. 300MB * 1MB 블록을 할당 할 수있는 8MB의 여유 메모리를 확보 할 수있었습니다. 동의 할 수 있도록 답장 해주십시오. – Kylo

답변

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

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

관련 문제