He estado jugando con OpenCL recientemente, y puedo escribir kernels simples que usan solo memoria global. Ahora me gustaría comenzar a usar la memoria local, pero parece que no puedo entender cómo usar get_local_size()
y get_local_id()
para calcular un "fragmento" de salida a la vez.¿Cómo uso la memoria local en OpenCL?
Por ejemplo, supongamos que quería convertir el kernel de ejemplo OpenCL Hello World de Apple a algo que utiliza la memoria local. ¿Como lo harias? Aquí está el código fuente del núcleo original de:
__kernel square(
__global float *input,
__global float *output,
const unsigned int count)
{
int i = get_global_id(0);
if (i < count)
output[i] = input[i] * input[i];
}
Si este ejemplo no puede ser fácilmente convertida en algo que muestra cómo hacer uso de la memoria local, cualquier otro ejemplo sencillo es suficiente.
He leído el material introductorio de NVIDIA, y todavía encuentro los ejemplos demasiado complejos. Estoy buscando un ejemplo unidimensional simple de usar memoria local para mojarme los pies. – splicer
¡Gracias por agregar el código en su última edición! Parece que no puedo hacer funcionar tu núcleo ... ¿Cómo usaría clSetKernelArg() para la temperatura? ¿Debo usar clCreateBuffer() para la temperatura? Además, hay algunos errores tipográficos en su kernel: "temp * temp" debe ser "temp [ltid] * temp [ltid]", y se debe insertar un parche de cierre antes de la última línea. – splicer
Corriendo en la CPU bajo Snow Leopard, probé clSetKernelArg (kernel, 2, sizeof (cl_float), NULL); pero se bloquea. ¿Algunas ideas? – splicer