¿Cuándo usar los tipos de datos escalares de la API OpenCL?
He tenido problemas para entender cuándo usar los tipos de datos de la API OpenCL como cl_float, cl_uchar, etc., que se pueden encontrar aquí:
http://www.khronos.org/registry/cl/sdk/1.0/docs/man/xhtml/scalarDataTypes.html
Los ejemplos que he visto que implican copiar un búfer al dispositivo se ven así:
float data[DATA_SIZE]; // original data set given to device
//Create the input and output arrays in device memory for our calculation
input = clCreateBuffer(context, CL_MEM_READ_ONLY, sizeof(float) * count, NULL,
// Write our data set into the input array in device memory
err = clEnqueueWriteBuffer(commands, input, CL_TRUE, 0, sizeof(float) * count, data, 0, NULL, NULL);
if (err != CL_SUCCESS)
{
printf("Error: Failed to write to source array!\n");
exit(1);
}
Este código fue tomado directamente de una muestra de código de Apple disponible aquí:https://developer.apple.com/library/mac/samplecode/OpenCL_Hello_World_Example/Listings/ReadMe_txt.html
Notará en el código anterior que se copia una matriz de flotadores en el dispositivo. ¿Por qué esto no necesita ser una matriz de cl_floats? La memoria se copia directamente, ¿verdad? ¿Qué sucede si su flotante de host y la flotante del dispositivo no son del mismo tamaño?
¿Podría explicar por qué no es necesario usar cl_float? Si no es necesario en este caso, entonces cuandodebería se utilizarán los tipos opencl?