Proyectos de Intel Development Center en Rusia. Primitivas de rendimiento integradas de Intel

Nuestra historia sobre otro proyecto de Intel realizado en Rusia. Esta es la biblioteca Intel Integrated Performance Primitives: un conjunto de funciones básicas listas para usar, altamente optimizadas para varias arquitecturas Intel y completamente gratuitas para trabajar con imágenes, señales y datos arbitrarios. Cómo se originó este proyecto, cómo se desarrolló, qué está sucediendo en Intel IPP ahora, en el artículo debajo del corte. Y comenzaremos, como es habitual en el resumen, por el presente.



En KDPV: entrada al piso de IPP en la oficina de Intel en Nizhny Novgorod



¿Qué es Intel IPP ahora?



Entonces, Intel IPP son los bloques de construcción de primitivas funcionales que pueden acelerar significativamente el funcionamiento del software que procesa medios y datos, debido a optimizaciones específicas para microarquitecturas específicas y plataformas Intel, así como el uso más amplio posible de conjuntos de instrucciones vectoriales Intel SSE e Intel AVX de todas las versiones.

Las funciones de IPP cubren cuatro grandes dominios:



  • Procesamiento de imágenes;
  • Compresión de datos;
  • Procesamiento de la señal;
  • Criptografía.


La actual Intel IPP 2020 Update 2 contiene más de 2500 primitivas de procesamiento de imágenes, 1300 primitivas de procesamiento de señales, 500 de visión por computadora y 300 de criptografía.



La biblioteca se mejora constantemente: está optimizada para nuevas plataformas, se agregan nuevas funciones y la vieja y poco utilizada se elimina inevitablemente.

Intel IPP se ejecuta en cualquier dispositivo x86 que ejecute Linux, macOS, Windows y Android. Es decir, los procesadores no solo de Intel, sino también de otros fabricantes son compatibles, además, IPP trabaja en ellos rápidamente, aunque, por supuesto, no tan rápido como en los dispositivos Intel.



Al mismo tiempo, los usuarios de IPP no necesitan un conocimiento profundo sobre la plataforma de ejecución de su código utilizando IPP y las acciones asociadas; la versión requerida de optimizaciones se llamará automáticamente.



IPP está escrito en C usando las llamadas funciones intrínsecas del compilador. Para diferentes modelos de uso de la biblioteca, existen diferentes versiones de la misma: de un solo subproceso para llamadas de diferentes subprocesos de aplicaciones externas y de múltiples subprocesos, utilizando una paralelización interna eficiente.



Para aquellos interesados ​​en la velocidad de trabajo en Intel Xeon y Core: algunos puntos de referencia .



IPP está disponible actualmente como parte de Intel Parallel Studio XE , Intel System Studio y solo por sí mismo... Y - absolutamente gratis para uso personal y comercial.



Curiosamente, el área más "cerrada" de nuestra vida es la criptografía, en el caso de IPP ahora es la más abierta: este es un proyecto de código abierto disponible en Github .



La base, el enfoque y la API que trajo IPP cuando apareció por primera vez en el procesamiento de señales e imágenes ahora se pueden llamar un estándar tácito; lo mismo se aplica a la criptografía.



Millones de usuarios utilizan todos los componentes de la biblioteca en cientos de miles de aplicaciones en todo el mundo. Incluso dentro de la propia empresa, en varias divisiones de Intel. Intel IPP proporciona una aceleración significativa de la biblioteca OpenCV. Por cierto, una compilación personalizada de Intel IPPcon funciones utilizadas por OpenCV, lanzado en 2015, se convirtió en la primera versión gratuita y gratuita de IPP.



Intel IPP se puede encontrar en aplicaciones de mejora y reconocimiento de imágenes en todas las áreas, incluida la medicina; impresoras, incluidas 3D; videovigilancia digital; vehículos autónomos; reconocimiento y síntesis de voz; compresión de datos; telecomunicaciones y juegos. IPP funciona en todas partes, desde servidores hasta dispositivos portátiles. Se puede argumentar que si se inventara una máquina del tiempo, entonces su software ciertamente usaría Intel IPP.



Historia de IPP



Todo comenzó con las bibliotecas de procesamiento de señales (SPL) y procesamiento de imágenes (IPL) de Intel, desarrolladas por orden de Intel en el centro nuclear federal VNIIEF en Sarov (escribimos sobre esto en nuestra historia sobre OpenCV ).



En 1996 (o 1997, según varios testigos presenciales), en la oficina central de Intel Santa Clara, se celebró una reunión sobre nuevos planes para el desarrollo de SPL e IPL con la participación de curadores de proyectos estadounidenses y expertos invitados de Sarov, entre los que se encontraba el futuro arquitecto, inspirador y jefe del equipo de IPP, Boris. Sabanin, así como Sergey Kirillov, que actualmente dirige el trabajo sobre criptografía IPP.



El equipo de Sarov trajo su lista de propuestas, y una de ellas fue abrir las interfaces de las funciones IPL y SPL de bajo nivel para los usuarios, ya que ya se habían implementado y optimizado de todos modos, mientras que algunos usuarios no se sentían cómodos con los formatos de datos IPL, ya tenían sus formatos de imagen establecidos. El prototipo propuesto de la interfaz IPP, utilizando estructuras que son más simples en comparación con IPL / ISL, fue creado por Boris Sabanin durante una discusión literalmente en una servilleta. Pero en ese momento, la propuesta de la parte rusa, aunque no fue rechazada, no recibió mucho apoyo, estaba en el medio de la lista con baja prioridad. Pero después de un par de años, alguien en Intel recordó esto (muy probablemente, Shin Li, quien más tarde se convirtió en el "evangelista" de Intel IPP) y los planes cambiaron.





Un libro de Intel IPP de 2004 por Stewart Taylor, un participante en la histórica reunión de IPP (entonces un recién contratado licenciado en Stanford de Intel)



Así es como comenzó el trabajo en Intel Performance Primitives, que luego fueron rebautizadas como Integrated Performance Primitives.



En 1999 se creó una versión interna de IPP, llamémosla 1.0. Era más una prueba de concepto, un prototipo para demostrar la viabilidad del concepto. No se lanzó como producto, pero definió y perfeccionó el concepto, la arquitectura y las especificaciones de IPP. La primera versión pública inmediatamente llevó el número 2.0 y fue lanzada en abril de 2002.



Hasta 2009, la mayor parte del trabajo en las bibliotecas de IPP se llevó a cabo bajo el liderazgo de Boris Sabanin, quien legítimamente puede ser considerado el padrino y el alma de IPP. Puso mucho esfuerzo en el proyecto, creó un equipo de especialistas versátiles, pero, desafortunadamente, no estuvo a la altura del vigésimo aniversario de Intel IPP.





Pintura "El puente a la torre Sarov" de Boris Sabanin, conocido no solo por IPP ( aquí puedes ver otras pinturas de Sabanin, incluido su autorretrato)



Pero el legado de IPL / ISL no se limitó a. Las primitivas para la criptografía y la compresión de datos aparecieron casi de inmediato. Los experimentos comenzaron en el campo de la visión por computadora, que luego se convirtió en un proyecto con OpenCV, utilizando la aceleración de algoritmos usando primitivas en el dominio ippCV.



Por supuesto, este no fue el único experimento y rama en la historia de la creación de bibliotecas. IPP siguió el ritmo de todo Intel. En consecuencia, por ejemplo, la quinta versión de IPP, además de x86, admitía el procesador Intel XScale (arquitectura ARM) y Intel Itanium (IA-64). A lo largo de los años, IPP ha incluido componentes como renderizado realista, operaciones de matriz pequeña, integridad de datos, códecs de audio y video.



Esta funcionalidad se puede utilizar ahora, si se desea, utilizando el paquete de bibliotecas heredadas de IPP disponible para descargar.



Además, los códecs de video IPP sirvieron más tarde como base para otro producto Intel bien conocido: Intel Media SDK, y el trazado de rayos se implementó en el proyecto de código abierto Intel Embree .



De las interesantes experiencias tecnológicas en el campo de la estructura de IPP, podemos señalar un ejemplo de un controlador de Windows para demostrar la posibilidad de que IPP funcione en modo kernel, así como una versión de IPP para ejecutarse en GPU Intel integradas escritas en C for Metal .



Es curioso que los números de versión de IPP primero fueran en orden del 1 al 9, y luego comenzaron a designarse por el año de lanzamiento: 2017-2020.





El equipo de desarrollo de Intel IPP en 2003



Durante la existencia de la familia de bibliotecas IPP, más de 100 personas participaron en su trabajo en Sarov, Nizhny Novgorod y Moscú. ¡Ahora la sede de IPP está ubicada en Nizhny Novgorod y se ve muy atractiva!





Decoración de suelos IPP en Intel



¡IPP no es una biblioteca primitiva en absoluto!



Aunque el nombre de Intel IPP contiene la palabra “primitivo”, y a primera vista, no puede haber dificultades fundamentales en el conjunto de “piezas de diseño” para crear programas productivos, que de hecho es IPP, la estructura de estas bibliotecas no es nada baladí. Se han aplicado interesantes soluciones tecnológicas para garantizar el máximo rendimiento y usabilidad de IPP.



Como ya se mencionó, IPP contiene miles de funciones (y cada función tiene varias versiones optimizadas para una arquitectura específica), lo que conduce a enormes tamaños de bibliotecas listas para usar, lo cual no es en absoluto un elemento en la lista de beneficios para los usuarios de IPP.

Por lo tanto, el IPP se recopila de una manera especial. Los archivos de origen, que incluyen una gran cantidad de funciones simples, se cortan mediante un script especial en muchos pequeños antes de la compilación, una función por archivo. Y luego se compilan estos minifiles. Además, se compilan no una, sino varias veces, para diferentes arquitecturas con los indicadores correspondientes. El resultado son varias bibliotecas estáticas enormes, para cada dominio de IPP. Pero estas bibliotecas estáticas se unen a partir de archivos de objetos muy pequeños. Por lo tanto, cuando IPP está vinculado estáticamente a una aplicación, el tamaño de la aplicación aumenta casi exactamente por el tamaño de las funciones utilizadas desde IPP, no más bytes.



IPP también tiene un mecanismo para generar bibliotecas personalizadas basadas en herramientas existentes sin tener que abrir el código fuente a los usuarios. Es decir, el usuario selecciona una lista de funciones de interés de los archivos de encabezado, después de lo cual una pequeña biblioteca dinámica con solo las funciones necesarias y sus dependencias se crea automáticamente mediante un script a partir de enormes bibliotecas estáticas. Además, para reducir aún más el tamaño, esta biblioteca dinámica puede incluir opciones de ensamblaje para estas funciones, no para todas las opciones de hardware, sino exclusivamente para una lista de plataformas especificada por el usuario.



En una situación en la que cada porcentaje adicional del rendimiento de las bibliotecas de IPP importa, se vuelve muy importante decidir a qué nivel paralelizar el código: dentro de las funciones de la biblioteca, lo que es bueno para las llamadas de IPP desde un subproceso de usuario, o afuera, a nivel de aplicaciones de usuario, lo cual es bueno para Aplicaciones multiproceso que separan de forma independiente el trabajo y los datos para IPP.



Dado que las aplicaciones son diferentes y los IPP también se hacen diferentes. Es decir, el paquete IPP incluye dos conjuntos de bibliotecas en versiones de 32 y 64 bits: una es puramente de un solo subproceso interno, y la segunda es con paralelización interna de un número significativo de funciones utilizando OpenMP (la lista exacta de funciones se adjunta en los documentos adjuntos). Además, hay otra versión para las bibliotecas de procesamiento de imágenes: la "Capa de subprocesos", que es un complemento sobre IPP de un solo subproceso y utiliza OpenMP o Intel TBB para la paralelización externa del trabajo en imágenes, que se dividen en fragmentos (mosaicos) para esto. ... El código fuente de IPP Threading Layer está disponible en el paquete IPP para aquellos que desean tener el mayor control sobre cómo se ejecuta su código al mismo tiempo.



Casi desde el inicio de IPP, los desarrolladores han tenido que preocuparse por el problema de que las canalizaciones de procesamiento de imágenes y señales, que consisten en funciones de IPP individuales, se ejecutan más lentamente de lo que les gustaría. La explicación es simple: cuando se llaman funciones IPP, por regla general, se realiza la carga y descarga desde la caché o incluso desde la memoria, y esta operación puede resultar mucho más costosa que los cálculos reales. Este efecto es especialmente notable cuando se procesan big data, no los que se denominan big data, sino, por ejemplo, imágenes FullHD (sin mencionar 4K).



La decisión de combinar varias funciones dentro de IPP en una en este caso no es adecuada; entonces, en lugar de ladrillos primitivos, obtendremos detalles elegantes del juego "Tetris", que será problemático para insertar en aplicaciones de usuario, y la variedad de tales asociaciones posibles excederá todos los límites razonables.



Como resultado, se implementó un complemento de C ++ sobre IPP, que construyó gráficos de canalización, cortó imágenes en pedazos y luego lanzó un ciclo paralelo que realizó no una operación en cada subproceso, sino toda la canalización de IPP en un mosaico separado. Al final, por supuesto, los resultados se mantuvieron unidos. Primero se hizo un prototipo y mostró una aceleración decente. Luego, se creó una configuración llamada DMIP (procesamiento de imágenes en modo diferido). Además, en 2011, en una de las primeras reuniones del comité de estándares OpenVX en Khronos, DMIP fue mencionado y apoyado calurosamente por el comité dada la popularidad de los gráficos entre los desarrolladores de hardware. Entonces, el estándar OpenVX resultó estar basado en tecnología gráfica. Por varias razones, el estándar OpenVX no ha recibido suficiente popularidad, pero ahora el paradigma de gráficos es compatible y desarrollado por el equipo de Intel Graph API.Y dado que Graph API está incluido en OpenCV, OpenVINO, Movidius SDK, existe un impacto directo de las tecnologías IPP en los estándares de visión por computadora y las API modernas.



IPP - enlaces útiles



Una vez más, aquí están los enlaces más importantes de este artículo.





Intel IPP en primera persona



Demos la palabra a las personas que han jugado un papel importante en el destino de Intel Performance Primitives en diferentes años.



Vladimir Dudnik, jefe del equipo Intel IPP en 2009-2011

-, IPP – , . , - , .. IPP - , - .

, , , , SIMD . , , MKL, IPP .


, OpenCV, IPPCV 2006-2008

IPP , , , . FFT. — ! , IPP , , .

IPP , , OCaml, Spiral, FFT — IPP. IPP. , , , , 13-14 , .



, IPP QA 2011-2015 , IPP 2017-2020

IPP QA 2000. , , .

17 IPP. Intel . waterfall & development agile & DevOps. . , .

– . , , . , , , . , , , .


, Image & Signal Processing Intel IPP, 2020 –

IPP SW 2011 , . , . IPP , , , Resize, WarpAffine, WarpPerspective . . C 2017 , , , 2018 IPP Crypto GitHub. 2018 , 2020 IPP, Image & Signal Processing . , , IPP Intel, .



All Articles