¿Por qué recibo un CL_MEM_OBJECT_ALLOCATION_FAILURE?
-
18-09-2019 - |
Pregunta
Estoy asignar un búfer cl_mem en un y trabajar en él, que trabaja bien hasta que se supera un cierto tamaño. En ese caso, la asignación en sí tiene éxito, pero la ejecución o la copia no lo hace. Yo quiero utilizar la memoria del dispositivo para un funcionamiento más rápido por lo asigno como:
buf = clCreateBuffer (cxGPUContext, CL_MEM_WRITE_ONLY, buf_size, NULL, &ciErrNum);
Ahora lo que no entiendo es el límite de tamaño. Estoy copiando unos 16 Mbytes, pero debería ser capaz de usar unos 128 Mbytes (ver CL_DEVICE_MAX_MEM_ALLOC_SIZE
).
¿Por qué estos números difieren tanto?
Aquí hay algo de extracto de 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
Solución
clCreateBuffer realidad no va a crear una memoria intermedia en el dispositivo. Esto tiene sentido, ya que en el momento de la creación del conductor no sabe qué dispositivo se utilice la memoria intermedia (recordar que el contexto puede tener múltiples dispositivos). El tampón se creará en el dispositivo real cuando encolar una escritura o cuando se lanza un núcleo que lleva el búfer como un parámetro.
En cuanto al límite de 16 MB, ¿está utilizando el controlador más reciente (195.xx)? Si por lo que debe ponerse en contacto con NVIDIA ya sea a través de la o directamente.
Otros consejos
No se olvide que cualquier otra memoria que por casualidad han utilizado en el dispositivo (y, si ésta es también la tarjeta gráfica, la memoria que está utilizando la pantalla).
(¿Hay una manera de conseguir la memoria disponible actual, o el fragmento más grande, o algo por el estilo?)