2013-07-26 3 views
0

큰 데이터 배열 (2.4G)을 메모리에로드하고 결과를 호스트 (~ 1.5G)에 저장 한 다음 수행 데이터를 해제하고 결과를로드하는 추력 코드가 있습니다. 디바이스에 다른 계산을 수행하고 마지막으로 초기 데이터를 다시로드합니다. 추력 코드는 다음과 같습니다 : 무료 내 정의 된 기능으로CUDA 추력 메모리 할당 문제

thrust::host_device<float> hostData; 
// here is a code which loads ~2.4G of data into hostData 
thrust::device_vector<float> deviceData = hostData; 
thrust::host_vector<float> hostResult; 
// here is a code which perform calculations on deviceData and copies the result to hostResult (~1.5G) 
free<thrust::device_vector<float> >(deviceData); 
thrust::device_vector<float> deviceResult = hostResult; 
// here is code which performs calculations on deviceResult and store some results also on the device 
free<thrust::device_vector<float> >(deviceResult); 
deviceData = hostData; 

그러나

template<class T> void free(T &V) { 
    V.clear(); 
    V.shrink_to_fit(); 
    size_t mem_tot; 
    size_t mem_free; 
    cudaMemGetInfo(&mem_free, &mem_tot); 
    std::cout << "Free memory : " << mem_free << std::endl; 
} 

template void free<thrust::device_vector<int> >(thrust::device_vector<int>& V); 
template void free<thrust::device_vector<float> >(
    thrust::device_vector<float>& V); 

, 나는 "추력 :: 시스템을 얻을 :: 세부 사항 :: bad_alloc 뿐이다 '무엇을() : 표준 : : bad_alloc : 메모리 부족 "오류 cudaMemGetInfo이 시점에서 내 장치의 ~ 6G의 여유 메모리가 있기 때문에 반환하더라도 hostData 다시 deviceData로 복사하려고하면 오류가 발생했습니다. 다음은 무료 방법의 전체 출력입니다.

Free memory : 6295650304 
Free memory : 6063775744 
terminate called after throwing an instance of 'thrust::system::detail::bad_alloc' 
what(): std::bad_alloc: out of memory 

무료인데도 불구하고 메모리가 부족하다는 뜻입니다. 트러스트 벡터를위한 메모리를 해제하는 것이 올바른 방법일까요? 나는이 코드가 더 작은 크기의 데이터 (최대 1.5G)에 대해 잘 작동 함을 알아야한다.

+0

사용중인 운영 체제, 드라이버 및 GPU는 무엇입니까? Windows Vista/7/8 인 경우 TCC 모드가 활성화되어 있습니까? – talonmies

+0

우분투 12.04에서 CUDA 5 및 드라이버 310.40으로 GTX Titan을 사용합니다. – Namux

답변

2

완벽하고 편집 가능한 재생산 코드를 보는 것이 유용 할 것이다. 그러나 당신은 아마 메모리 단편화를 실행하고 있습니다.

많은 양의 메모리가 사용 가능한 것으로보고 될 수 있지만 하나의 큰 연속 된 청크에 할당 할 수없는 경우 일 수 있습니다. 이 단편화는 요청할 수있는 단일 할당의 최대 크기를 제한합니다.

아마도 메모리를 해제하는 방법에 대한 질문은 아니지만 메모리를 확보 한 후에 오버 헤드 할당이 더 많이 유지되는 기능입니다. 당신이 mem 정보를 확인하고 큰 숫자를 얻고 있다는 사실은 나에게 당신이 당신의 할당을 정확하게 해방하고 있다고 말한다.

이 문제를 해결하기 위해 한 가지 방법은 할당을 신중하게 관리하고 다시 사용하는 것입니다. 예를 들어, 장치에 float의 대형 2.4G 작업 장치 벡터가 필요하면이를 한 번 할당하고 연속적인 작업을 위해 다시 사용하십시오. 또한 2.4G 벡터를 다시 할당하려고 시도하기 직전에 장치에 남아있는 할당량이있는 경우 2.4G를 다시 할당하기 전에 해당 할당량을 해제하십시오 (예 : 장치에서 할당을 모두 해제하십시오). 벡터.

+0

코드를 통해 2.4G 벡터를 재사용하면이 작업이 가능합니다. 감사! – Namux

1

동일한 오류 메시지/문제에 대한 답변을 검색 할 때이 질문을 통해이 답변을 제공합니다. 다른 사람이 만들 때/A device_vector용량 할당 device_vector를 요청하면 크기 요청 device_vector보다 훨씬 크다는 것을 아는

로버트 Crovella의 훌륭한 대답은 확실히 올바른 그러나, 그것은 유용 할 수있다.

이 대답은 Understanding Thrust (CUDA) memory usage입니다. 왜 이렇게 추력이 이런 식으로 행동하는지 자세히 설명합니다. 제 경우

우분투 16.04에서 쿼드 K1200, CUDA 툴킷 8.0, 사이즈의 device_vector 67,108,864 (복식) 요청이 큰 (536,870,912)가 할당되는 8 배 수용 할 수있는 결과 device_vector.

Requested (R) | Capacity (C) | Total Mem | Free Mem | C/Free | R/C 
67108864  | 536870912  | 4238540800 | 3137077248 | 0.171137 | 0.125 

위의 출력은 내가 링크 된 답변에서 매우 유용한 코드를 수정 한 것입니다.