문제

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를 통해 연락해야합니다 포럼 또는 직접.

다른 팁

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

(현재 사용 가능한 메모리, 또는 가장 큰 조각을 얻을 수있는 방법이 있습니까?)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top