2017-09-30 23 views
-3

지포스 GTX 1080 TI 및 \ 또는 GeForce GTX 1080 GPU에서 cudaMallocPitch API를 사용하는 중에 '메모리 부족'오류가 발생합니다. 는 4 개의 GPU (1 1080 TI 및 3 1080)와 2 개의 CPU를 포함하는 전체 PC 서버의 일부입니다.cudaMallocPitch는 메모리가 충분하지 않아도 분리 된 CPU 프로세스로 멀티 GPU를 제어하는 ​​동안 실패합니다.

각 GPU는 전용 CPU 스레드에 의해 제어됩니다.이 CPU 스레드는 실행이 시작될 때 올바른 장치 인덱스로 cudaSetDevice를 호출합니다.

구성 파일 정보를 기반으로 응용 프로그램은 얼마나 많은 CPU 스레드를 만들어야하는지 알 수 있습니다.

각 응용 프로그램이 서로 다른 GPU를 제어하는 ​​분리 된 프로세스로 여러 번 응용 프로그램을 실행할 수도 있습니다.

이미지 백그라운드 뺄셈을 수행하기 위해 OpenCV 버전 3.2를 사용하고 있습니다.

먼저,이 메소드를 사용하여 BackgroundSubtractorMOG2 객체를 생성해야합니다 : cv :: cuda :: createBackgroundSubtractorMOG2 그리고 그 후에 apply 메소드를 호출해야합니다.

첫 번째 적용 방법은 모든 필요한 메모리가 한 번 할당됩니다.

내 이미지 크기는 10000 열과 7096 행입니다. 각 픽셀은 1B (그레이 스케일)입니다.

여러 개의 스레드 (각 GPU마다 하나씩)가있는 하나의 프로세스로 응용 프로그램을 실행할 때 모든 것이 잘 작동하지만 OpenCV 적용 함수가 시작되는 분리 된 프로세스 (각 GPU마다 하나씩)로 4 번 실행하면 cudaMallocPitch '메모리 부족'오류로 인해 실패합니다.

모든 GPU에 대해 처음 적용하기 전에 사용 가능한 메모리가 충분한 것으로 확인되었습니다. 1080의 경우 5.5GB, 1080 TI의 경우 8.3GB, 요청 된 크기는 width - 120000bytes, Height - 21288bytes - 2.4GB입니다.

알려 주시기 바랍니다.

+0

마지막 질문과 어떻게 다른가요? – talonmies

+0

이 질문은 내 진짜 문제입니다. 조사의 일환으로 나는 이전 질문에 의해 표현 된보다 간단한 논리로 그것을 재현하려고 시도했다. 실수로 나는 완전히 괜찮은지 보지 못했습니다. 내 테스트가 괜찮다는 것을 알게 된 후 나는 내 진짜 문제에 대해 물어보기로했습니다. – OronG

+1

당신은 우리가 당신의 말을 디버깅 할 수 있도록 도와 주시겠습니까? 문제의 코드를 보지 않고서 어떤 일이 잘못 될지 누가 말할 수 있습니까? – talonmies

답변

-1

문제 소스가 발견되었다 : cudaErrorMemoryAllocation했다

cudaMallocPitch의 API 인해 OS에서 사용하지 않는 사용 가능한 OS의 가상 메모리가 있다는 사실에 값을 반환하는 과정을 읽을 수행 할 때 \ 쓰기가 GPU에 물리적으로 액세스 기억.

그 때문에 CUDA 드라이버는 GPU의 실제 메모리 할당에 실패합니다.

여기서 복잡한 것은 충분한 GPU 실제 메모리가 존재하는 동안 (cudaMemGetInfo API로 확인)이 API가 실패한 이유를 알아내는 것입니다. 내 PC에 충분한 가상 메모리가없는 이유는

  1. :

    나는 두 점을 분석하기 시작? 다음 링크의 지침을 수행함으로써 나는 그 크기를 변경하고 문제가 사라되었다 https://www.online-tech-tips.com/computer-tips/simple-ways-to-increase-your-computers-performace-configuring-the-paging-file/

  2. 왜 내 프로세스는 OS 가상 메모리를 많이 소비? 이전에 처리 시간 동안 더 나은 성능을 얻으려면 할당 작업에 필요한 메모리 크기에 따라 많은 시간이 걸리기 때문에 필요한 모든 GPU 물리적 메모리를 처음에 한 번만 할당해야한다는 것을 알았습니다. ~ 70Mbytes의 프레임 해상도로 작업 중이며 처리 논리에 많은 양의 보조 버퍼가 필요했기 때문에 대규모 GPU와 CPU 메모리 영역을 할당해야 OS 가상 메모리 영역을 비울 수있었습니다.