He visto en una publicación aquí que podemos llamar a una función desde un kernel OpenCL. Pero en mi situación, necesito esa función compleja para ser paralelizada (ejecutada por todos los hilos disponibles) también, así que ¿tengo que hacer que esa función también sea un kernel y llamarlo directamente como la función del kernel principal? o cuál es la solución posible para esta situación? Gracias de antemanoLlamar al kernel OpenCL desde otro kernel OpenCL
Respuesta
Puede llamar a las funciones auxiliares de su kernel y se paralelizarán de la misma manera que el núcleo, imagínelas como están dentro del código del kernel. Por lo tanto, cada elemento de trabajo invocará la función auxiliar para el conjunto de trabajo que maneja.
float4 helper_function(float4 input)
{
return input.x + input.y + input.z + input.w;
}
__kernel kernel_function(const float4* arr, float4* out)
{
id = get_global_id(0);
out[id] = helper_function(arr[id]);
}
Si entiendo su pregunta correctamente, quiere hacer un pase completo separado sobre un búfer desde el interior del kernel. No creo que eso sea posible desde el kernel, por lo que tendrías que crear el código para el pase "interno" como un núcleo separado y también llamar ese kernel por separado desde tu código de host. La salida de ese kernel no tiene que volverse a leer en la memoria del host, pero puede permanecer en la memoria del dispositivo entre las llamadas al kernel.
OpenCL 2.0 spec agregó una nueva función para el paralelismo dinámico.
6.13.17 Enqueuing Kernels
OpenCL 2.0 allows a kernel to independently enqueue to the same device, without host
interaction. ...
En el siguiente ejemplo my_func_B enqueus my_func_A en el dispositivo:
kernel void
my_func_A(global int *a, global int *b, global int *c)
{
...
}
kernel void
my_func_B(global int *a, global int *b, global int *c)
{
ndrange_t ndrange;
// build ndrange information
...
// example – enqueue a kernel as a block
enqueue_kernel(get_default_queue(), ndrange, ^{my_func_A(a, b, c);});
...
}
- 1. ¿Cómo compilar el kernel OpenCL en Bitstream?
- 2. Tipos personalizados en el kernel OpenCL
- 3. ¿Cómo usar una matriz 3-D en el kernel OpenCL?
- 4. ¿Cómo puedo depurar un kernel OpenCL en Xcode 4.1?
- 5. OpenCL: ¿es posible invocar otra función desde dentro de un kernel?
- 6. OpenCL Performance Optimization
- 7. ¿Cómo pasar y acceder a los vectores de C++ al kernel OpenCL?
- 8. OpenCL: coherencia de memoria del dispositivo/host para variables pasadas al kernel con CL_MEM_USE_HOST_PTR
- 9. ¿Cómo puedo forzar al compilador OpenCL de Apple a recompilar un kernel en caché?
- 10. Cómo estructurar kernels OpenCL grandes?
- 11. OpenCL escalar del vector vs
- 12. La ejecución del kernel OpenCL no se inicia hasta que clFinish o clWaitForEvents se llamen
- 13. Mi kernel OpenCL es más lento en hardware más rápido ... ¿Pero por qué?
- 14. OpenCL AMD vs NVIDIA rendimiento
- 15. ¿Cómo puedo saber si mi kernel OpenCL se está ejecutando en una GPU?
- 16. Argumentos al kernel
- 17. Distribución de OpenCL
- 18. Histograma de imagen OpenCL
- 19. Pasando array al parámetro de función en OpenCL
- 20. Abysmal OpenCL ImageSampling performance vs OpenGL TextureSampling
- 21. CUDA: Llamar a una función __device__ desde un kernel
- 22. Los tipos de vectores OpenCL usan SIMD
- 23. Barreras en OpenCL
- 24. Ejecución concurrente del kernel GPU desde procesos múltiples
- 25. Problema al llamar a la plantilla kernel CUDA
- 26. biblioteca de matriz opencl
- 27. OpenCL vs. DirectCompute?
- 28. ¿Cómo uso la memoria local en OpenCL?
- 29. OpenCL compatible con DSP
- 30. Memoria en OpenCL
adición a la respuesta sramij, llamando a otro núcleo desde el kernel es llamado como dinámico paralelismo. para esto necesitas el dispositivo que admite OpenCL 2.0. puede referirse a http://stackoverflow.com/questions/12913640/opencl-dynamic-parallelism-gpu-spawned-threads – Meluha