vray requiere renderizar procesamiento premiere imagenes forzar filtros este ejemplos efecto definicion con aceleracion image-processing cuda gpu

image processing - requiere - ¿Las GPU son buenas para el filtrado de imágenes basado en casos?



procesamiento digital de imagenes definicion (5)

Estoy tratando de averiguar si cierto problema es un buen candidato para usar CUDA para poner el problema en una GPU.

Básicamente estoy haciendo un filtro de caja que cambia en función de la detección de algunos bordes. Así que hay básicamente 8 casos que se prueban para cada píxel, y luego sucede el resto de las operaciones: cálculos medios típicos y demás. ¿La presencia de estas instrucciones de conmutación en mi ciclo hará que este problema sea un mal candidato para ir a la GPU?

No estoy seguro de cómo evitar las instrucciones de cambio, porque esta detección de borde tiene que ocurrir en cada píxel. Supongo que toda la imagen podría tener la parte de detección de bordes separada del algoritmo de procesamiento, y podría almacenar un búfer correspondiente a cada filtro para cada píxel, pero parece que agregaría mucho preprocesamiento al algoritmo .

Editar: Solo para dar un contexto: este algoritmo ya está escrito, y OpenMP se ha utilizado con bastante buen efecto para acelerarlo. Sin embargo, los 8 núcleos en mi caja de desarrollo palidecen en comparación con los 512 en la GPU.


El uso de una GPU para el procesamiento a menudo puede ser contraintuitivo; cosas que obviamente son ineficientes si se hacen en código de serie normal, en realidad son la mejor manera de hacerlo en paralelo usando la GPU.

El pseudo-código a continuación parece ineficiente (ya que computa 8 valores filtrados por cada píxel) pero se ejecutará de manera eficiente en una GPU:

# Compute the 8 possible filtered values for each pixel for i = 1...8 # filter[i] is the box filter that you want to apply # to pixels of the i''th edge-type result[i] = GPU_RunBoxFilter(filter[i], Image) # Compute the edge type of each pixel # This is the value you would normally use to ''switch'' with edge_type = GPU_ComputeEdgeType(Image) # Setup an empty result image final_result = zeros(sizeof(Image)) # For each possible switch value, replace all pixels of that edge-type # with its corresponding filtered value for i = 1..8 final_result = GPU_ReplacePixelIfTrue(final_result, result[i], edge_type==i)

¡Espero que eso ayude!


La detección de bordes, los cálculos medios y la correlación cruzada se pueden implementar como convoluciones 2D. Las convoluciones se pueden implementar en la GPU de manera muy efectiva ( aceleración> 10, hasta 100 con respecto a la CPU), especialmente para núcleos grandes. Así que sí, puede tener sentido reescribir el filtrado de imágenes en la GPU.

Aunque no usaría la GPU como una plataforma de desarrollo para tal método.


Sí, el flujo de control generalmente tiene una penalización de rendimiento en la GPU, ya sea en el caso de / switch''es / ternary del operador , ya que con las operaciones de flujo de control la GPU no puede ejecutar subprocesos de forma óptima. Las tácticas usuales son evitar la bifurcación como sea posible. En algunos casos, los IF pueden reemplazarse por alguna fórmula, donde las condiciones de IF se correlacionan con los coeficientes de la fórmula. Pero la solución / optimización concreta depende del kernel de la GPU concreta ... Tal vez pueda mostrar el código exacto, para que la comunidad lo analice aún más.

EDITAR: En caso de que esté interesado aquí es el sombreador de píxeles de convolución que escribí.


típicamente, a menos que esté en la nueva arquitectura CUDA, querrá evitar la bifurcación. debido a que las GPU son básicamente máquinas SIMD, la línea de plexiglás es extremadamente insoportable y sufre tremendamente en los puestos de tuberías debido a errores de predicción de las ramas.

Si piensa que hay beneficios significativos que se obtienen al usar una GPU, haga algunos puntos de referencia preliminares para tener una idea aproximada.

si desea aprender un poco sobre cómo escribir código no ramificado, diríjase a http://cellperformance.beyond3d.com/ y eche un vistazo.

Además, la investigación de la ejecución de este problema en múltiples núcleos de CPU también puede valer la pena, en cuyo caso es probable que desee examinar OpenCL o las bibliotecas de rendimiento de Intel (como TBB).

Otra fuente de referencia para los problemas que apuntan a la GPU, ya sean gráficos, geometría computacional o de otro tipo, es IDAV, el Instituto para el Análisis y Visualización de Datos: http://idav.ucdavis.edu


La ramificación en realidad no es tan mala, si hay coherencia espacial en la ramificación. En otras palabras, si espera trozos de píxeles uno al lado del otro en la imagen para pasar por la misma bifurcación, el golpe de rendimiento se reduce al mínimo.