Tengo una aplicación donde necesito tomar la intensidad promedio de una imagen para alrededor de 1 millón de imágenes. Se "siente" como un trabajo para un sombreador de fragmentos de GPU, pero los sombreadores de fragmentos son para cálculos locales por píxel, mientras que el promedio de imágenes es una operación global.Sumas de intensidades de imagen en GPU
Un enfoque que consideré es cargar la imagen en una textura, aplicar una imagen borrosa de 2x2, cargar el resultado en una textura N/2 x N/2 y repetir hasta que la salida sea 1x1. Sin embargo, esto tomaría aplicaciones log del shader.
¿Hay alguna forma de hacerlo en una sola pasada? ¿O debería simplemente descomponer y usar CUDA/OpenCL?
Mi aplicación realiza la coincidencia de chaflán de un modelo 3D proyectado a una imagen de entrada. Represento una imagen que contiene los bordes de la silueta de mi modelo, y para cada píxel de borde, utilizo una tabla de búsqueda para encontrar el píxel de borde más cercano en la imagen de entrada. Entonces necesito el resultado promedio, lo que me dice que el modelo se ajusta a los datos. Intenté leer los píxeles del borde renderizado de opengl y hacer coincidir el chaflán en la CPU, pero la operación de lectura fue un gran cuello de botella.Esperaba que al hacer todo el trabajo en la GPU y leer solo en un solo valor, obtuviera una gran aceleración. –
(ctd) Dado que puedo pasar la tabla de búsqueda como una textura, puedo hacer las búsquedas en un sombreador de vértices, pero todavía tengo el cuello de botella de leer los datos nuevamente en la memoria principal. –
Nada te obliga a desenfocar 2x2, podrías hacer, por ejemplo, desenfocar con una caja de 16x16 y luego cargar el resultado en una textura de N/16 x N/16. De esa forma puede lograr grandes operaciones de aceleración y menos copia ... –