OpenCL en tareas cotidianas

Recientemente, hablamos sobre HSA y durante la discusión de las ventajas del nuevo enfoque para construir PC, tocamos un tema tan interesante como GPGPU: computación de uso general en un acelerador de gráficos. Hoy en día, los aceleradores de video AMD brindan acceso a sus recursos utilizando OpenCL, un marco que proporciona un sistema de alto paralelo programable relativamente simple e intuitivo.


Hoy en día, las tecnologías OpenCL son compatibles con todos los principales actores del mercado: la capacidad de proporcionar programas con acceso a aceleración "avanzada" (también gratuita, ya que OpenCL no implica regalías ni regalías) claramente vale la pena, y todos se benefician de la versatilidad de tales API quien implementa el soporte OpenCL en sus productos.

Lea más sobre dónde puede encontrar OpenCL en la vida cotidiana de hoy, cómo acelera el software de oficina habitual y qué oportunidades ofrece a los desarrolladores hoy y hablaremos.

GPGPU, OpenCL y un poco de historia


Por supuesto, OpenCL no es la única forma de implementar la informática general de GPU. Además de OpenCL, hay CUDA, OpenACC y C ++ AMP en el mercado, pero las dos primeras tecnologías son realmente populares y conocidas.

Las mismas personas que dieron al mundo tecnologías OpenGL y OpenAM: Khronos Group, estaban desarrollando el estándar OpenCL. La marca registrada OpenCL es propiedad de Apple, pero, afortunadamente para los programadores y usuarios de todo el mundo, esta tecnología no está cerrada ni vinculada a los productos de la compañía "apple". Además de Apple, Khronos Goup incluye gigantes del mercado como Activision Blizzard, AMD, IBM, Intel, NVidia y una docena más de compañías (principalmente fabricantes de soluciones ARM) que se unieron al consorcio más tarde.

Hasta cierto punto, OpenCL y CUDA son ideológica y sintácticamente similares, de los cuales la comunidad solo se ha beneficiado. Debido a la similitud de ciertos métodos y enfoques, es más fácil para los programadores usar ambas tecnologías, cambiar de un hardware "cerrado" y NVidia CUDA a universal y trabajar en todas partes (incluidas las CPU multinúcleos convencionales y las supercomputadoras basadas en la arquitectura CELL) OpenCL .

OpenCL en uso diario


Ahora pensarás, "sí, hablarán sobre juegos y photoshop". No, OpenCL es capaz de acelerar la informática más allá de los gráficos. Una de las aplicaciones más populares que utilizan las capacidades de GPGPU es ... una suite ofimática multiplataforma LibreOffice. El soporte de OpenCL apareció en él en 2014 y se utiliza para acelerar los cálculos en el administrador de tablas Calc.

Aquí hay una comparación visual del rendimiento del sistema con el AMD A10-7850K con el núcleo de gráficos R7 y el Intel Core I5 ​​con el HD4600 a bordo:



En las pruebas sintéticas, el mismo AMD A10-7850K en computación heterogénea con OpenCL supera al casi doble i5-4670K / 4690 :


Por cierto, en la ciencia y sus áreas aplicadas hay muchas tareas que cambian perfectamente a los procesadores vectoriales de los aceleradores de video y le permiten realizar cálculos decenas y cientos de veces más rápido que en la CPU.

Por ejemplo, varias secciones de álgebra lineal. La multiplicación de vectores y matrices es lo que hacen las GPU todos los días, trabajando con gráficos. En estas tareas, prácticamente no tienen igual, porque Su arquitectura ha sido perfeccionada para resolver tales problemas durante años.

Esto también incluye la rápida transformación de Fourier y todo lo que está conectado con ella: resolver ecuaciones diferenciales complejas por varios métodos. Por separado, podemos distinguir los problemas gravitacionales de los cuerpos Nque se utilizan para calcular la aerodinámica y la hidrodinámica, modelar líquidos y plasma. La complejidad de los cálculos radica en el hecho de que cada partícula interactúa con las demás, las leyes de interacción son bastante complicadas y los cálculos deben llevarse a cabo en paralelo. Para tales tareas, las capacidades de GPU OpenCL y AMD son perfectamente adecuadas, como computación paralela con muchos objetos y resuelto con éxito en procesadores de este tipo todos los días: en sombreadores de píxeles .

Las cuadrículas estructuradas a menudo se usan en gráficos ráster. No estructurado: en cálculos en el campo de la hidrodinámica y en varios cálculos con elementos cuyas gráficas tienen pesos diferentes. Diferencias entre rejillas estructuradas y no estructuradas en el número de "vecinos" de cada elemento: las rejillas estructuradas tienen la misma diferencia, las rejillas no estructuradas tienen diferentes, pero ambas encajan perfectamente con la capacidad de OpenCL para acelerar los cálculos. Las dificultades para transferir cálculos son principalmente matemáticas. Es decir, la tarea principal del programador no es solo "escribir" el trabajo del sistema, sino también desarrollar una descripción matemática que transfiera datos a las capacidades de hardware utilizando OpenCL.

Lógica combinatoria (el cálculo de hash también se aplica aquí), métodos de Monte Carlo- Eso está bien portado a la GPU. Una gran cantidad de módulos informáticos, un alto rendimiento en computación paralela son los que realmente aceleran estos algoritmos.

¿Qué más se puede acelerar con OpenCL y potentes GPU?


Busca el camino de regreso. Cálculos gráficos y programación dinámica: clasificación, detección de colisión (contacto, intersección), generación de estructuras regulares, varios algoritmos de selección y búsqueda. Con algunas limitaciones, pero se prestan a la optimización y la aceleración del trabajo de las redes neuronales y las estructuras relacionadas, pero aquí, los problemas son más propensos a virtualizar las estructuras neuronales, es más rentable utilizar soluciones FPGA. El trabajo de las máquinas de estados finitos (que ya se utilizan para trabajar con la GPU, por ejemplo, cuando se trata de comprimir / descomprimir una señal de video o trabajar para encontrar elementos duplicados) es excelente.

OpenCL vs CUDA


Comparar directamente el rendimiento de OpenCL y CUDA tiene poco sentido. En primer lugar, si los comparamos en las tarjetas de video AMD y NVidia, los adaptadores de video AMD ganarán en una carrera de capacidades informáticas: los modernos aceleradores NVidia tienen una serie de limitaciones de rendimiento en formato FP64 introducidas por el propio NVidia para vender tarjetas de video "profesionales" para informática (series Tesla y Titan Z). Su precio es incomparablemente más alto que el de sus contrapartes FLOPS basadas en soluciones AMD y sus tarjetas "relacionadas" en la línea numérica de NVidia, lo que hace que la comparación sea bastante complicada. Puede tener en cuenta la productividad por vatio o la productividad por dólar, pero esto no tiene casi nada que ver con una comparación pura de la potencia de cómputo: "FLOPS a cualquier costo" está débilmente relacionado con la situación financiera actual,y en términos de rendimiento por dólar, la "vieja" Edición 7970 GHz (también conocida como R9 280X) sigue siendo una de las tarjetas de video más rentables.

En segundo lugar, puede intentar comparar OpenCL y CUDA en una tarjeta de video de NVidia, pero NVidia implementa OpenCL a través de CUDA en el nivel del controlador, por lo que la comparación será algo deshonesta por razones obvias.

Por otro lado, si tiene en cuenta no solo el rendimiento, aún puede hacerse algún análisis.

OpenCL se ejecuta en una lista de hardware mucho más grande que NVidia CUDA. Casi todas las CPU que admiten el conjunto de instrucciones SSE 3, los aceleradores de video de Radeon HD5xxx y NVidia GT8600 a los últimos Fury / Fury-X y 980Ti / Titan X, AMD APU, gráficos integrados Intel - en general, casi cualquier hardware moderno con múltiples núcleos puede Aprovecha esta tecnología.

Las características de implementación de CUDA y OpenCL (así como la documentación bastante complicada, ya que la programación paralela en su conjunto dista mucho de ser el área de desarrollo más fácil), se reflejan más bien en capacidades y herramientas de desarrollo específicas, y no en el campo de la productividad.

Por ejemplo, OpenCL tiene algunos problemas de asignación de memoria debido a "La documentación de OpenCL no está muy clara aquí".

Al mismo tiempo, CUDA es inferior a OpenCL en el campo de sincronización de flujos: datos, instrucciones, memoria, cualquier cosa. Además, usando OpenCL, puede usar colas e instrucciones fuera de orden, y CUDA todavía sabe cómo ordenarlas. En la práctica, esto evita el tiempo de inactividad del procesador mientras se esperan datos, y el efecto es más notorio, cuanto más larga sea la cubierta del procesador y mayor será la diferencia entre la velocidad de la memoria y la velocidad de los módulos informáticos. En pocas palabras: cuanta más potencia asignes bajo OpenCL, mayor será la brecha en el rendimiento. CUDA requerirá escribir código mucho más complejo para lograr resultados comparables.

Herramientas de desarrollo (depurador, perfilador, compilador) CUDA es algo mejor que otras similares en OpenCL, pero CUDA implementa API a través de C y OpenCL a través de C ++, simplificando el trabajo con programación orientada a objetos, mientras que ambos marcos abundan con "local »Trucos, restricciones y características.



El enfoque de NVidia en este caso es muy similar al de Apple. Una solución cerrada, con un gran conjunto de restricciones y reglas estrictas, pero bien afilada para trabajar en un hardware específico.

OpenCL ofrece herramientas y capacidades más flexibles, pero requiere un mayor nivel de capacitación por parte de los desarrolladores. El código general en un OpenCL puro debería ejecutarse en cualquier hardware que lo soporte, pero al mismo tiempo "optimizado" para soluciones específicas (por ejemplo, aceleradores de video AMD o procesadores CELL) funcionará mucho más rápido.

Source: https://habr.com/ru/post/es388421/


All Articles