Pregunta

Estoy interesado en saber si alguien ha escrito una aplicación que se aprovecha de un GPGPU mediante el uso, por ejemplo, nVidia CUDA.Si es así, ¿qué problemas encontraste y qué mejoras de rendimiento que se logró en comparación con un estándar de la CPU?

¿Fue útil?

Solución

He estado haciendo gpgpu desarrollo con ATI stream SDK en lugar de Cuda.¿Qué tipo de rendimiento de la ganancia que se obtenga depende de un mucho de factores, pero el más importante es el número de la intensidad.(Es decir, la proporción de calcular operaciones a las referencias de memoria.)

Un BLAS de nivel 1 o BLAS de nivel 2 de la función como suma de dos vectores sólo hace 1 operación matemática para cada una de las 3 referencias de memoria, por lo que el NI es (1/3).Esto siempre es ejecutar más lento con CAL o Cuda que acaba de hacer en la cpu.La razón principal es el tiempo necesario para transferir los datos desde la cpu a la gpu y la espalda.

Para una función como FFT, hay O(N log N) cálculos y O(N) las referencias de memoria, por lo que el NI es O(log N).Si N es muy grande, digamos de 1.000.000 es probable que sea más rápido que hacerlo en la gpu;Si N es pequeño, digamos de 1.000 casi ciertamente será más lento.

Para un BLAS de nivel 3 o LAPACK función como la descomposición LU de una matriz, o la búsqueda de sus valores propios, no son O( N^3) cálculos y O(N^2) las referencias de memoria, por lo que el NI es O(N).Por muy pequeños arreglos, decir que N es un par de puntuación, esto todavía va a ser más rápido para hacer en la cpu, pero como N aumenta, el algoritmo muy rápidamente pasa de la memoria ligadas a la demanda computacional y el aumento de rendimiento de la gpu se eleva muy rápidamente.

Cualquier cosa que involucre complejo arithemetic tiene más cálculos que escalar la aritmética, de la que generalmente se duplica el NI y aumenta el rendimiento de la gpu.


(fuente: earthlink.net)

Aquí es el rendimiento de CGEMM -- complejo de precisión simple multiplicación matriz-matriz hecho en una Radeon 4870.

Otros consejos

He escrito trivial aplicaciones, realmente ayuda si usted puede parallize los cálculos de punto flotante.

He encontrado el siguiente curso cotaught por la Universidad de Illinois, en Urbana Champaign profesor y una NVIDIA ingeniero muy útil cuando yo era empezar: http://courses.ece.illinois.edu/ece498/al/Archive/Spring2007/Syllabus.html (incluye grabaciones de las ponencias).

He utilizado CUDA para varios algoritmos de procesamiento de imágenes.Estas aplicaciones, por supuesto, son muy adecuados para CUDA (o cualquier paradigma de procesamiento de la GPU).

De la OMI, hay tres etapas típicas cuando se traslada un algoritmo para CUDA:

  1. Migración Inicial: Incluso con un conocimiento muy básico de CUDA, puede puerto de algoritmos simples dentro de un par de horas.Si tiene suerte, puede ganar un factor de 2 a 10 en el rendimiento.
  2. Trivial Optimizaciones: Esto incluye el uso de texturas para la entrada de datos y relleno de matrices multidimensionales.Si es un usuario experimentado, esto se puede hacer en un día y que podría dar otro factor de 10 en el rendimiento.El código resultante es todavía legible.
  3. Hardcore Optimizaciones: Esto incluye copiar los datos a la memoria compartida para evitar global de la latencia de la memoria, convirtiendo el código de adentro hacia afuera para reducir el número de registros, etc.Usted puede pasar varias semanas con este paso, pero la ganancia de rendimiento no es realmente vale la pena en la mayoría de los casos.Después de este paso, el código será tan ofuscado que nadie lo entiende (incluido usted).

Esto es muy similar a la optimización de un código para la Cpu.Sin embargo, la respuesta de una GPU para optimizaciones de rendimiento es aún menos predecible que para la Cpu.

He estado usando GPGPU para la detección de movimiento (Originalmente el uso de CG y ahora CUDA) y estabilización (usando CUDA) con el procesamiento de la imagen.He estado recibiendo alrededor de un 10-20X aceleración en estas situaciones.

Por lo que he leído, esto es bastante típico de datos-algoritmos paralelos.

Aunque no tengo ninguna experiencia práctica con CUDA sin embargo, he estado estudiando el tema y encontró una serie de documentos, que el documento de resultados positivos usando el Api GPGPU (todos ellos incluyen CUDA).

Este papel describe cómo la base de datos de combinaciones puede ser paralellized mediante la creación de un número de paralelos primitivas (mapa, de dispersión, de reunir etc.) que puede ser combinado en un algoritmo eficiente.

En este papel, en paralelo una implementación del estándar de cifrado AES es creado con la velocidad comparable a la discreta cifrado de hardware.

Finalmente, este papel analiza cómo bien CUDA se aplica a una serie de aplicaciones tales como estructurados y no estructurados de las redes, la combinación de la lógica, programación dinámica y la minería de datos.

He implementado un Monte Carlo de cálculo en CUDA para algunos financiera de su uso.Optimizado el código CUDA es de aproximadamente 500 veces más rápido que un "podría haber intentado más, pero no realmente" multi-roscado de la CPU de la aplicación.(Comparando una GeForce 8800GT a un Q6600 aquí).Se conoce que la Monte Carlo problemas paralela, aunque.

Los principales problemas encontrados implica la pérdida de precisión debido a G8x y G9x del chip de la limitación de solo de IEEE de punto flotante de precisión de los números.Con el lanzamiento de la GT200 chips esto podría ser mitigado en cierta medida por el uso de la doble precisión de la unidad, en el costo de algunos de rendimiento.Yo no lo he probado todavía.

También, desde CUDA es un C extensión, su integración en otra aplicación puede ser no trivial.

He implementado un Algoritmo Genético en la GPU y consiguió ups de velocidad de alrededor de 7..Más ganancias son posibles con una numérico mayor intensidad como alguien señaló.Así que sí, las ganancias son de ahí, si la aplicación es correcta

Escribí un complejo de valores de la multiplicación de la matriz del núcleo que vencer a la cuBLAS aplicación por sobre el 30% para la aplicación que estaba utilizando, y una especie de vector externa de la función del producto de que se ejecutó varios órdenes de magnitud de una multiplicación de seguimiento de la solución para el resto del problema.

Se trataba de un proyecto final de carrera.Me tomó un año completo.

http://www.maths.tcd.ie/~oconbhup/Maths_Project.pdf

He implementado la Factorización de Cholesky para la solución de los grandes ecuación lineal en el uso de la GPU ATI Stream SDK.Mis observaciones fueron

alt text

Consiguió el rendimiento de la aceleración del ritmo de hasta 10 veces.

Trabajando en el mismo problema a optimizar más, escalando a múltiples GPUs.

Sí.He implementado el No Lineal Filtro De Difusión Anisotrópica el uso de la api de CUDA.

Es bastante fácil, ya que es un filtro que se deben ejecutar en paralelo dada una imagen de entrada.No he encontrado muchas dificultades en este, ya que sólo requiere un simple kernel.La aceleración fue alrededor de 300x.Este fue mi proyecto final en CS.El proyecto se puede encontrar aquí (está escrito en portugués tú).

He tratado de escribir la Mumford&Shah el algoritmo de segmentación demasiado, pero que ha sido un dolor de escribir, ya que CUDA es todavía en el comienzo y así un montón de cosas extrañas suceden.Incluso he visto una mejora del rendimiento mediante la adición de un if (false){} en el código O_O.

Los resultados de este algoritmo de segmentación no iban bien.Yo tenía una pérdida de rendimiento de 20% en comparación con un CPU de enfoque (sin embargo, ya que es un CPU, un enfoque diferente que yelded los mismos resultados podrían ser tomadas).Es todavía un trabajo en progreso, pero unfortunaly dejé el laboratorio en el que estaba trabajando, así que tal vez algún día yo podría terminarlo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top