/ / OpenCL - actualizando iterativamente el búfer residente en GPU? - abierto

¿OpenCL - actualizando iterativamente el búfer residente en GPU? - abierto

Necesito tener un kernel de OpenCL para actualizar iterativamente un búfer y devolver los resultados. Para aclarar:

  1. Enviar buffer inicial al contenido del kernel.
  2. Kernel / worker actualiza cada elemento en el buffer
  3. El código del host lee los resultados, HOPEFULAMENTE de forma asíncrona, aunque no estoy seguro de cómo hacerlo sin bloquear el kernel.
  4. El kernel se ejecuta de nuevo, nuevamente actualiza cada elemento, pero el nuevo valor depende del valor anterior.
  5. Repita para un número fijo de iteraciones.

Hasta ahora, he sido capaz de falsificar esto proporcionandoun búfer de entrada y salida, copiando la salida de nuevo a la entrada cuando el kernel termina de ejecutarse, y reiniciando el kernel. Esto parece una enorme pérdida de tiempo y abuso de ancho de banda de memoria limitado, ya que el búfer es bastante grande (~ 1 GB).

¿Alguna sugerencia / ejemplo? Soy bastante nuevo en OpenCL, así que esto puede tener una respuesta muy simple.

Si importa, estoy usando Cloo / OpenCL.NET en un NVidia GTX460 y dos GTX295s.

Respuestas

2 para la respuesta № 1

Puede escribir sus datos iniciales en el dispositivo yCambia su contenido con tu kernel. Tan pronto como el kernel termine con su iteración, puede leer el mismo búfer de memoria y reiniciar el kernel para su próxima iteración. Los datos pueden permanecer en el dispositivo OpenCL. No es necesario enviarlo de nuevo al dispositivo.

No hay manera, que yo sepa, deSincronizar el trabajo entre host y dispositivo. Solo se puede iniciar la espera del kernel y su devolución. Luego vuelve a leer el resultado y comienza de nuevo. La lectura asíncrona sería peligrosa, ya que podría obtener resultados inconsistentes.


3 para la respuesta № 2

Te recomiendo crear un cl_mem en el dispositivo. Copia los datos allí. Y iterar con el kernel. Use la misma memoria para almacenar los resultados, que será más fácil para usted, ya que su kernel tendrá solo 1 parámetro.

Luego, solo necesita copiar los datos a cl_mem y ejecutar el kernel. Después de eso, extraiga los datos del dispositivo y ejecute el kernel nuevamente.

Si no te importa si esta iteración puede tener algunaDatos de la siguiente iteración. Puedes aumentar mucho el rendimiento, usar eventos y OUT_OF_ORDER_QUEUE. De esta manera, el núcleo puede ejecutarse mientras copia los datos.