2012-09-14 18 views
9

Desarrollé una función ingenua para duplicar una imagen horizontal o verticalmente usando CUDA C++.¿Las funciones de NPP no están completamente optimizadas?

Luego me di cuenta de que NVIDIA Performance Primitives Library también ofrece una función para el reflejo de imágenes.

Solo por el bien de la comparación, cronometré mi función contra NPP. Sorprendentemente, mi función superó (aunque por un pequeño margen, pero aún así ...).

Confirmé los resultados varias veces usando el temporizador de Windows, así como CUDA Timer.

Mi pregunta es que: ¿Las funciones NPP no están completamente optimizadas para las GPU NVIDIA?

Estoy usando CUDA 5.0, GeForce GTX460M (Compute 2.1) y Windows 8 para el desarrollo.

+0

¿Cuál fue la diferencia, en porcentaje? Las operaciones de duplicación estarán vinculadas a la memoria y los dispositivos más nuevos son flexibles en cuanto a los tipos de patrones de acceso a la memoria que manejarán de manera eficiente. Una implementación ingenua puede ser casi óptima en dispositivos más nuevos. Tal vez la versión de NPP funcione mejor para dispositivos más antiguos. Puede obtener las estadísticas de ancho de banda de memoria de su kernel desde el generador de perfiles y compararlas con el máximo para su dispositivo. –

+0

He probado en 4 tipos de imágenes y 2 tamaños diferentes. 8 bit, 16 bit, 1 canal, 3 canales, (1280 x 720), (1920 x 1080). Obtuve la aceleración máxima en una imagen de tamaño de canal único de 16 bits (1280 x 720), que era un 18,75 por ciento más rápida que la NPP. – sgarizvi

+1

Tiene usted razón de que falta el rendimiento de la central nuclear. Encontré mejores bibliotecas para hacer el procesamiento de imágenes CUDA. Personalmente me gusta la selección de procesamiento de imágenes de ArrayFire y he descubierto que es rápida, http://www.accelereyes.com/arrayfire/c/group__image__mat.htm Otras personas han informado sobre el uso de las características de GPU de OpenCV, aunque no he oído grandes cosas sobre eso. Tunacode en Pakistán también tiene algunas cosas. –

Respuesta

9

Me arriesgo a no obtener votos publicando esta respuesta. :)

NVIDIA trabaja continuamente para mejorar todas nuestras bibliotecas CUDA. NPP es una biblioteca particularmente grande, con más de 4000 funciones para mantener. Tenemos el objetivo realista de proporcionar a las bibliotecas una aceleración útil sobre un equivalente de CPU, que se prueban en todas nuestras GPU y sistemas operativos compatibles, y que se mejoran y mantienen activamente. La función en cuestión (Mirror) es un problema de rendimiento conocido que mejoraremos en una versión futura. Si necesita una función particular optimizada, su mejor forma de priorizarla es presentar un error RFE (Solicitud de mejora) utilizando el formulario de envío de errores disponible en NVIDIA CUDA registered developers.

Como nota aparte, no creo que ninguna biblioteca pueda ser "optimizada completamente". Con una gran biblioteca para soportar una gran base de hardware en crecimiento, ¡el trabajo para optimizarlo nunca termina! :)

Alentamos a la gente a que continúe probando y superando las bibliotecas de NVIDIA, porque en general, avanza en el estado de la técnica y beneficia al ecosistema informático.

+3

Como un aparte ... probablemente sea seguro decirlo que, con suficiente tiempo y esfuerzo, en general es posible superar las funciones de la biblioteca en términos de rendimiento sin procesar. Las bibliotecas generalmente hacen menos suposiciones para que sean más ampliamente aplicables. Cuando lances la tuya, puedes usar todas las suposiciones específicas de tu situación para acelerar las cosas.Un ejemplo que viene a la mente (no GPGPU, pero la misma idea probablemente se aplica) es en la clasificación. No es difícil superar los métodos de clasificación estándar, si sabe mucho sobre sus datos y está dispuesto a incluir esas suposiciones en el código. – Patrick87

Cuestiones relacionadas