2017-09-27 1 views
0

OpenCL에서 복잡한 알고리즘을 구현하고 있지만 NVidia 하드웨어에서 문제가 있습니다. 알고리즘이 여러 번 병렬로 호출 될 때 NVidia GPU의 메모리가 충분하지 않고 임의 스레드 실행이 MemoryAllocation 오류로 중단 될 수 있습니다 (이전에 https://devtalk.nvidia.com/default/topic/1019997/cuda-programming-and-performance/how-to-handle-cl_mem_object_allocation_failure-errors-if-amount-of-useable-memory-is-not-known-/에 대해 설명하려고했습니다).OpenCL : Nvidia 그래픽 하드웨어에서 사용 가능한 메모리 읽기 (OpenGL Extension ?, Cuda 런타임?)

현재 해결책은 GPU에서 사용 가능한 메모리가 충분하고 충분한 경우에만 실행을 허용합니다. 문제는 사용 가능한 메모리를 읽는 것입니다.

나는 내가 OpenGL을 문맥에 숨겨진 윈도우를 생성하는 메모리를 읽을

#define GL_GPU_MEM_INFO_CURRENT_AVAILABLE_MEM_NVX 0x9049 
glGetIntegerv(GL_GPU_MEM_INFO_CURRENT_AVAILABLE_MEM_NVX, 
    &currentlyAvailableMemoryInKb); 

를 사용합니다. 문제는 NVidia GPU가 기본 GPU가 아닌 경우 GPI 선호도 확장을 사용하여 카드를 선택해야한다는 것입니다. https://www.khronos.org/registry/OpenGL/extensions/NV/WGL_NV_gpu_affinity.txt이지만 wglGetProcAddress는 null을 반환합니다. Intel GPU를 기본 장치로 부팅하기 때문에 이것이라고 생각합니다. (wglCreatePbufferARB와 같은 다른 확장 프로그램을로드하는 것은 문제가되지 않습니다.)

이 문제를 처리하고 다른 gpu/드라이버에 wglGetProcAddress 호출을 전달할 수 있습니까?

미리 감사드립니다. 최고 감사합니다 마이클

추신 : 나는 또한 사용 가능한 메모리를 얻기 위해 쿠다 런타임을 사용하여 시도했다. 이것은 잘 풀리지 않았다. opencl 드라이버가 신뢰할 수 없습니다 (일부 cudart 기능을 사용한 후 교착 상태가 발생 함). 반환 값이 잘못되었습니다.

답변

1

다른 해결책을 찾았습니다. 전에 NVAPI에 대해 알지 못했지만이 라이브러리는 문제를 해결했습니다.

#define CL_DEVICE_PCI_BUS_ID_NV 0x4008 
cl_int busId = 0; 
device.getInfo(CL_DEVICE_PCI_BUS_ID_NV, &busId); 

가 그럼 난 NvAPI_EnumPhysicalGPUs는 엔비디아의 GPU를 열거하는 데 사용

내가 선택한 엔비디아 카드의 PCI ID를 얻기 위해 OpenCL을 사용합니다. NvAPI_GPU_GetBusId를 사용하면 이전 기능에서 반환 한 장치의 PCI 버스 ID를 얻을 수 있습니다. 버스 ID가 같으면 NvAPI_GPU_GetMemoryInfo를 호출하여 현재 사용 가능한 메모리 양을 가져옵니다.

지금까지 내가 가진 모든 문제를 해결했습니다. 의미 나는 보이지 않는 창을 열려면 opengl과 추한 핵을 떨어 뜨릴 수 있습니다.

관련 문제