2011-08-11 11 views
6

Estoy trabajando en un algoritmo que hace bastante la misma operación un montón de veces. Como la operación consiste en un poco de álgebra lineal (BLAS), creo que intentaré usar la GPU para esto.¿Cómo funciona la cola de comandos opencl, y qué puedo preguntar

He escrito mi kernel y comencé a presionar kernels en la cola de comandos. Como no quiero esperar después de cada llamada, creo que trataría de conectar en cadena mis llamadas con eventos y simplemente comenzar a presionarlos en la cola.

call kernel1(return event1) 
call kernel2(wait for event 1, return event 2) 
... 
call kernel1000000(vait for event 999999) 

Ahora mi pregunta es, ¿todo esto se ve empujado al chip gráfico de ¿almacena el conductor la cola? Hay un límite en el número de eventos que puedo usar, o en la longitud de la cola de comandos, he buscado pero no he podido encontrarlo.

Uso atMonitor para comprobar el uso de mi gpu 'y es bastante difícil presionarlo por encima del 20%, ¿podría ser simplemente porque no puedo enviar las llamadas lo suficientemente rápido? Mis datos ya están almacenados en la GPU y todo lo que estoy transmitiendo son las llamadas reales.

Respuesta

4

Primero, no debe esperar un evento de un kernel anterior a menos que el siguiente kernel tenga dependencias de datos en ese núcleo anterior. La utilización del dispositivo (normalmente) depende de que siempre haya algo listo para usar en la cola. Solo espere un evento cuando necesite esperar un evento.

"hace todo esto empujado al chip gráfico de ¿almacena el controlador la cola?"

Eso está definido por la implementación. Recuerde, OpenCL funciona en más que solo GPU. En términos de la dicotomía dispositivo/host de estilo CUDA, probablemente debería considerar las operaciones de cola de comandos (para la mayoría de las implementaciones) en el "host".

Intenta hacer cola en varias llamadas al núcleo sin esperar entre ellas. Además, asegúrese de estar usando un tamaño de grupo de trabajo óptimo. Si haces ambas cosas, deberías poder maximizar tu dispositivo.

1

Desafortunadamente no conozco las respuestas a todas sus preguntas y ahora me pregunto lo mismo, pero puedo decir que dudo que la cola OpenCL llegue a llenarse, ya que la GPU debería terminar de ejecutarse el último comando en cola antes de que se envíen al menos 20 comandos. Sin embargo, esto solo es cierto si tu GPU tiene un "perro guardián" porque eso evitaría que los kernels ridículamente largos (creo que 5 segundos o más) se ejecuten.

+0

Ok, ¿me puede decir de dónde sabe esto? Estoy tratando de descubrir las especificaciones reales de opencl, pero no es nada fácil. (Estoy considerando cambiar a CUDA). ¿Qué dice usted que el controlador agrupa los comandos y los envía al gpu en grandes porciones? –

+1

Creo que el controlador agrupa los comandos ya que según la documentación de OpenCL, cliquea bloques hasta que todos los comandos en la cola de comandos pasados ​​hayan terminado de ejecutarse, a menos que invoques clFinish OpenCL decidirá cuándo se ejecutan los comandos. Sin embargo, las llamadas a clFinish son costosas y deben evitarse, aún así lo intentaré. ¿Has considerado que tu GPU es posiblemente lo suficientemente rápida para ejecutar tu cálculo sin necesitar el 100% de la potencia? La única otra cosa en la que puedo pensar es que OpenCL limita el uso de la GPU para que la pantalla de las computadoras no se bloquee –

Cuestiones relacionadas