Cuando empecé a programar en OpenCL que utiliza el siguiente enfoque para proporcionar datos a mis granos:Memoria en OpenCL
cl_mem buff = clCreateBuffer(cl_ctx, CL_MEM_READ_WRITE, object_size, NULL, NULL);
clEnqueueWriteBuffer(cl_queue, buff, CL_TRUE, 0, object_size, (void *) object, NULL, NULL, NULL);
Obviamente, esto requería que particionar mis datos en fragmentos, lo que garantiza que cada trozo encajaría en la memoria del dispositivo. Después de realizar los cálculos, leía los datos con clEnqueueReadBuffer(). Sin embargo, en algún momento me di cuenta de que sólo podía utilizar la siguiente línea:
cl_mem buff = clCreateBuffer(cl_ctx, CL_MEM_READ_WRITE | CL_MEM_USE_HOST_PTR, object_size, (void*) object, NULL);
Al hacer esto, la partición de los datos se hizo obsoleto. Y para mi sorpresa, experimenté un gran impulso en el rendimiento. Eso es algo que no entiendo. Por lo que obtuve, cuando uso un puntero de host, la memoria del dispositivo funciona como un caché, pero todos los datos aún tienen que copiarse para su procesamiento y luego copiarlos nuevamente a la memoria principal una vez que haya terminado. ¿Cómo es que usar una copia explícita (clEnqueRead/WriteBuffer) es un orden de magnitud más lento, cuando en mi opinión debería ser básicamente el mismo? ¿Me estoy perdiendo de algo?
Gracias.
Conozco el indicador de bloqueo en clEnqueueRead/WriteBuffer. Sin embargo, cuando hice las medidas, utilicé un clFinish (al menos estoy bastante seguro de que lo hice), que debería tener el mismo efecto que la bandera de bloqueo, ¿o no? Eso es, por supuesto, solo si se procesa la misma cantidad de datos. Hm, tal vez la implementación de CL es lo suficientemente inteligente como para omitir la parte de un objeto al que no se accede (alrededor del 70%) ... ¡Gracias de todos modos! – VHristov