cl_mem_object_allocation_failure를받는 이유는 무엇입니까?
-
18-09-2019 - |
문제
a에 cl_mem 버퍼를 할당하고 있습니다 GPU 그리고 일정 크기가 초과 될 때까지 잘 작동합니다. 이 경우 할당 자체가 성공하지만 실행 또는 복사는 그렇지 않습니다. 더 빠른 작업을 위해 장치의 메모리를 사용하고 싶으므로 다음과 같이 할당합니다.
buf = clCreateBuffer (cxGPUContext, CL_MEM_WRITE_ONLY, buf_size, NULL, &ciErrNum);
이제 내가 이해하지 못하는 것은 크기 제한입니다. 약 16MBYTE를 복사하고 있지만 약 128 MBYTE를 사용할 수 있어야합니다 ( CL_DEVICE_MAX_MEM_ALLOC_SIZE
).
이 숫자가 왜 그렇게 많이 다릅니 까?
다음은 OcldeviceQuery의 발췌문입니다.
CL_PLATFORM_NAME: NVIDIA
CL_PLATFORM_VERSION: OpenCL 1.0
OpenCL SDK Version: 4788711
CL_DEVICE_NAME: GeForce 8600 GTS
CL_DEVICE_TYPE: CL_DEVICE_TYPE_GPU
CL_DEVICE_ADDRESS_BITS: 32
CL_DEVICE_MAX_MEM_ALLOC_SIZE: 128 MByte
CL_DEVICE_GLOBAL_MEM_SIZE: 255 MByte
CL_DEVICE_LOCAL_MEM_TYPE: local
CL_DEVICE_LOCAL_MEM_SIZE: 16 KByte
CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE: 64 KByte
해결책
ClcreateBuffer는 실제로 장치에 버퍼를 생성하지 않습니다. 생성 시점에 운전자는 어떤 장치가 버퍼를 사용할 것인지 알지 못하기 때문에 이는 의미가 있습니다 (컨텍스트에 여러 장치가있을 수 있음을 기억하십시오). 버퍼는 쓰기를 큐에 넣거나 버퍼를 매개 변수로 취하는 커널을 시작할 때 실제 장치에서 생성됩니다.
16MB 한도는 최신 드라이버 (195.xx)를 사용하고 있습니까? 그렇다면 NVIDIA를 통해 연락해야합니다 포럼 또는 직접.
다른 팁
장치에서 사용한 다른 메모리를 잊지 마십시오 (그리고 그래픽 카드 인 경우 디스플레이가 사용하는 메모리).
(현재 사용 가능한 메모리, 또는 가장 큰 조각을 얻을 수있는 방법이 있습니까?)
제휴하지 않습니다 StackOverflow