2009-11-06 11 views
4

GPU에 cl_mem 버퍼를 할당하고 있습니다. 특정 크기를 초과 할 때까지 제대로 작동합니다. 이 경우 할당 자체는 성공하지만 실행 또는 복사는 성공하지 못합니다. 나는 더 빠른 작업을 위해 장치의 메모리를 사용하여 다음과 같이 할당하고 싶습니다.왜 CL_MEM_OBJECT_ALLOCATION_FAILURE가 표시됩니까?

buf = clCreateBuffer (cxGPUContext, CL_MEM_WRITE_ONLY, buf_size, NULL, &ciErrNum); 

이제 크기 제한이 이해가되지 않습니다. 약 16MB를 복사 중이지만 약 128MB를 사용할 수 있어야합니다 (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 
+0

이 해결되지 않은 및 까다로운 주제입니다. 불행히도 내가 사용해온 하드웨어가 변경되어서 문제를 재현하는 방법을 모르겠습니다. – count0

+0

Im은 GeForce 8800 GTS에서 같은 문제가 발생했습니다. 모든 실행마다 오류가 발생하기 때문에 어떤 크기가 필요합니까? 그러나 7mb ~ 20mb의 범위에서 전형적입니다. 최대 메모리 할당 크기는 128MB입니다. –

답변

3

clCreateBuffer 실제로 장치에서 버퍼를 생성하지 않습니다. 이는 생성 당시 드라이버가 어떤 장치가 버퍼를 사용할지를 알지 못하기 때문에 (컨텍스트가 여러 장치를 가질 수 있다는 것을 상기하십시오) 의미가 있습니다. 버퍼는 쓰기를 대기열에 넣거나 버퍼를 매개 변수로 사용하는 커널을 시작할 때 실제 장치에 만들어집니다.

16MB 제한은 최신 드라이버 (195.xx)를 사용하고 있습니까? 그렇다면 forums을 통해 또는 직접 NVIDIA에 문의하십시오.

+0

나는 이것을 더 이상 재현 할 수 없지만 당신이 언급 한 것은 의미가있다. 당신이 c/C++ 배경에서 왔을 때 당신이 당신이 요청한 지점에서 당신의 메모리가 할당되고 있다고 가정하는 경우 조금 어색합니다. – count0

+0

이 오류는 내 드라이버를 업데이트 한 후에 사라졌습니다. – user1873073

2

기기에서 사용한 다른 메모리 (그래픽 카드 인 경우 디스플레이가 사용하는 메모리)도 잊지 마십시오.

(현재 사용 가능한 메모리, 또는 가장 큰 조각을 얻을 또는 somesuch하는 방법이 있나요?)

+1

예, clGetDeviceInfo()에는 총 메모리, 최대 단일 할당 등과 관련된 일련의 매개 변수가 있습니다. – Tom