소량의 전체 메모리 (20M 미만)를 할당하는 CUDA 프로그램을 실행할 때 "메모리 부족"오류가 발생합니다. (다른 사람들의 게시물에서이 문제는 메모리 단편화와 관련이 있다고 생각합니다.)이 문제를 이해하려고 노력하며 CUDA 메모리 관리와 관련된 몇 가지 질문이 있다는 것을 알고 있습니다.CUDA 메모리는 어떻게 관리됩니까?
CUDA에는 가상 메모리 개념이 있습니까?
하나의 커널 만 CUDA에서 동시에 실행할 수있는 경우 종료 후 사용 중이거나 할당 된 모든 메모리가 해제됩니까? 그렇지 않다면,이 메모리가 무료로 출시되었을 때?
CUDA에서 둘 이상의 커널을 실행할 수 있다면, 그들이 사용하는 메모리가 겹치지 않는 것을 어떻게 확인할 수 있습니까?
누구나 내가이 질문에 답할 수 있도록 도와 줄 수 있습니까? 감사합니다
편집 1 : 운영 체제 : x86_64에 GNU/리눅스 CUDA 버전 : 4.0 장치 : 지포스 200, 그것은 기계에 부착 된 GPU를 하나이며, 나는 그것이 디스플레이 장치라고 생각하지 않습니다.
편집 2 다음은 몇 가지 조사를 한 후에 얻은 것입니다. 저를 시정 해주십시오.
CUDA는 각 호스트 스레드에 대해 하나의 컨텍스트를 생성합니다. 이 컨텍스트는 다른 응용 프로그램이이 응용 프로그램에 쓸 수 없도록이 응용 프로그램에 예약 된 메모리 (사전 할당 메모리 또는 동적 할당 메모리)와 같은 정보를 유지합니다. 이 응용 프로그램이 종료되면 (커널 아님)이 메모리 부분이 해제됩니다.
CUDA 메모리는 링크 목록에 의해 유지됩니다. 응용 프로그램에서 메모리를 할당해야하는 경우이 링크 목록을 통해 할당 할 수있는 연속적인 메모리 청크가 있는지 확인합니다. 이러한 청크를 찾지 못하면 사용 가능한 총 메모리 크기가 요청 된 메모리보다 큰 경우에도 "메모리 부족"오류가 사용자에게보고됩니다. 이것이 메모리 단편화와 관련된 문제입니다.
cuMemGetInfo는 얼마나 많은 메모리가 비어 있는지 알려주지 만, 메모리 조각화로 인해 최대 할당량에 할당 할 수있는 메모리 양은 아닙니다.
Vista 플랫폼 (WDDM)에서 GPU 메모리 가상화가 가능합니다. 즉, 여러 응용 프로그램이 거의 모든 GPU 메모리를 할당 할 수 있으며 WDDM이 스왑 데이터를 주 메모리로 다시 관리합니다.
새로운 질문 : 응용 프로그램이 종료 된 후 상황에 예약 된 메모리가 완전히 해제 될 경우 1., 메모리 단편화가 존재하지 않아야합니다. 메모리에 어떤 종류의 데이터가 남아 있어야합니다. 2. GPU 메모리를 재구성 할 수있는 방법이 있습니까?
질문을 편집하여 사용중인 운영 체제, GPU 및 cuda 버전, GPU가 디스플레이 장치인지 비 표시 장치인지를 포함 할 수 있습니까? 그것은 당신의 질문에 대한 정답에 관계 될 것입니다. – talonmies
추가 질문에 대답하려면 - 사용자가 관찰 할 수있는 조각화가 컨텍스트 내에서 발생합니다 *. GPU 내에서 메모리 매핑을 변경하는 방법이 없으며 모두 호스트 드라이버에서 처리합니다. – talonmies
설명대로 컨텍스트 할당은 컨텍스트 정적 할당, 컨텍스트 사용자 할당 및 CUDA 컨텍스트 런타임 힙으로 구성됩니다. 컨텍스트 정적 할당 및 컨텍스트 사용자 할당의 크기가 미리 결정된 것 같습니다. 따라서 메모리 조각화의 유일한 원인은 Fermi 아키텍처에만있는 컨텍스트 런타임 힙 (heap)이라고 생각합니다. 그 맞습니까? 나는 시스템이 컨텍스트 런타임 힙 (heap)을위한 메모리 덩어리를 미리 할당하여 커널 내부 동적 메모리 할당을 가능하게 할 것으로 생각한다. – xhe8