Projetos do Intel Development Center na Rússia. Intel Integrated Performance Primitives

Nossa história sobre outro projeto da Intel feito na Rússia. Esta é a biblioteca Intel Integrated Performance Primitives - um conjunto pronto para uso, altamente otimizado para várias arquiteturas Intel e funções básicas totalmente gratuitas para trabalhar com imagens, sinais e dados arbitrários. Como esse projeto se originou, como se desenvolveu, o que está acontecendo na Intel IPP agora - no artigo abaixo do corte. E começaremos, como é de praxe no resumo, pelo presente.



No KDPV - entrada do andar IPP no escritório da Intel em Nizhny Novgorod



O que é Intel IPP agora



Portanto, Intel IPP é os blocos de construção de primitivos funcionais que podem acelerar significativamente a operação de software que processa mídia e dados, devido a otimizações específicas para microarquiteturas e plataformas Intel específicas, bem como o uso mais amplo possível de conjuntos de instruções vetoriais Intel SSE e Intel AVX de todas as versões.

As funções IPP cobrem quatro grandes domínios:



  • Processamento de imagem;
  • Compressão de dados;
  • Processamento de sinais;
  • Criptografia.


O atual Intel IPP 2020 Update 2 contém mais de 2.500 primitivas de processamento de imagem, 1.300 primitivas de processamento de sinal, 500 visão computacional e 300 criptografia.



A biblioteca é constantemente melhorada - é otimizada para novas plataformas, novas funcionalidades são adicionadas e a antiga, pouco usada, é inevitavelmente removida.

Intel IPP funciona em qualquer dispositivo x86 rodando Linux, macOS, Windows e Android. Ou seja, processadores não só da Intel, mas também de outros fabricantes são suportados, além disso, o IPP funciona neles rapidamente, embora, é claro, não tão super rápido quanto nos dispositivos Intel.



Ao mesmo tempo, os usuários de IPP não precisam de conhecimento profundo sobre a plataforma de execução de seu código usando IPP e as ações associadas - a versão necessária de otimizações será chamada automaticamente.



O IPP é escrito em C usando as chamadas funções intrínsecas do compilador. Para diferentes modelos de uso da biblioteca, existem diferentes versões dela: single-threaded para chamadas de diferentes threads de aplicativos externos e multi-threaded, usando paralelização interna eficiente.



Para aqueles interessados ​​na velocidade de trabalho no Intel Xeon e Core - alguns benchmarks .



IPP está atualmente disponível como parte do Intel Parallel Studio XE , Intel System Studio e apenas por si mesmo... E - absolutamente grátis para uso pessoal e comercial.



Curiosamente, a área mais "fechada" da nossa vida é a criptografia, no caso do IPP agora é a mais aberta - este é um projeto de código aberto disponível no Github .



A base, a abordagem e a API que o IPP trouxe quando apareceu pela primeira vez no processamento de sinais e imagens agora podem ser chamadas de padrão não falado - o mesmo se aplica à criptografia.



Todos os componentes da biblioteca são usados ​​por milhões de usuários em centenas de milhares de aplicativos em todo o mundo. Incluindo dentro da própria empresa - em várias divisões da Intel. Intel IPP fornece aceleração significativa da biblioteca OpenCV. A propósito, um IPP Intel de construção personalizadacom funções usadas pelo OpenCV, lançado em 2015, tornou-se a primeira versão gratuita e gratuita do IPP.



O Intel IPP pode ser encontrado em aplicativos de reconhecimento e aprimoramento de imagem em todas as áreas, incluindo medicina; impressoras, incluindo 3D; vigilância por vídeo digital; veículos autônomos; reconhecimento e síntese de fala; compressão de dados; telecomunicações e jogos. O IPP funciona em qualquer lugar - de servidores a vestíveis. Pode-se argumentar que, se uma máquina do tempo fosse inventada, seu software certamente usaria o Intel IPP.



História do IPP



Tudo começou com as bibliotecas de processamento de sinais (SPL) e processamento de imagens (IPL) da Intel, desenvolvidas por encomenda da Intel no centro nuclear federal VNIIEF em Sarov (escrevemos sobre isso na história sobre OpenCV ).



Em 1996 (ou 1997, de acordo com várias testemunhas), na sede da Intel Santa Clara, foi realizada uma reunião sobre os planos de desenvolvimento do SPL e IPL com a participação de curadores de projetos americanos e especialistas convidados de Sarov, entre os quais estava o futuro arquiteto, inspirador e chefe da equipe do IPP Boris Sabanin, assim como Sergey Kirillov, que atualmente lidera o trabalho de criptografia IPP.



A equipe do Sarov trouxe sua lista de propostas, e uma delas era abrir as interfaces das funções IPL e SPL de baixo nível aos usuários, uma vez que já haviam sido implementadas e otimizadas de qualquer maneira, enquanto alguns usuários não se sentiam confortáveis ​​com formatos de dados IPL, eles já tinham seus formatos de imagem estabelecidos. O protótipo proposto da interface IPP, usando estruturas mais simples em comparação com IPL / ISL, foi criado por Boris Sabanin durante uma discussão literalmente em um guardanapo. Mas naquela época, a proposta do lado russo, embora não tenha sido rejeitada, não recebeu muito apoio - estava no meio da lista com baixa prioridade. Mas depois de alguns anos, alguém na Intel se lembrou disso (provavelmente, Shin Li, que mais tarde se tornou o "evangelista" da Intel IPP) e os planos mudaram.





Um livro de 2004 da Intel IPP escrito por Stewart Taylor, um participante da histórica reunião do IPP (na época um recém-contratado bacharel em Stanford pela Intel).



Foi assim que o trabalho começou no Intel Performance Primitives, que mais tarde foi renomeado Integrated Performance Primitives.



Uma versão interna do IPP, vamos chamá-la de 1.0, foi criada em 1999. Era mais uma Prova de Conceito, um protótipo para comprovar a viabilidade do conceito. Não foi lançado como produto, mas permitiu definir e refinar o conceito, a arquitetura e as especificações do IPP. A primeira versão pública carregou imediatamente o número 2.0 e foi lançada em abril de 2002.



Até 2009, a maior parte do trabalho nas bibliotecas do IPP foi realizada sob a liderança de Boris Sabanin, que pode ser considerado o padrinho e alma do IPP. Ele colocou muito esforço no projeto, montou uma equipe de especialistas versáteis, mas, infelizmente, não viveu até o 20º aniversário da Intel IPP.





Pintura "A Ponte para a Torre Sarov" de Boris Sabanin, conhecida não só pelo IPP ( aqui podem ver outras pinturas de Sabanin, incluindo o seu autorretrato)



Mas o legado do IPL / ISL não se limitou a. Os primitivos para criptografia e compactação de dados apareceram quase imediatamente. Os experimentos começaram na área de Visão Computacional, que posteriormente evoluiu para um projeto com OpenCV, usando aceleração de algoritmos usando primitivas no domínio ippCV.



Claro, este não foi o único experimento e ramificação na história da criação de bibliotecas. O IPP acompanhou todo o Intel. Assim, por exemplo, a quinta versão do IPP, além do x86, suportava o processador Intel XScale (arquitetura ARM) e Intel Itanium (IA-64)! Ao longo dos anos, o IPP incluiu componentes como renderização realista, pequenas operações de matriz, integridade de dados, codecs de vídeo e áudio.



Esta funcionalidade pode ser usada agora, se desejado, usando o pacote IPP Legacy Libraries disponível para download.



Além disso, codecs de vídeo IPP serviram mais tarde como base para outro produto da Intel bem conhecido - Intel Media SDK, e o rastreamento de raios foi implementado no projeto de código aberto Intel Embree .



Experimentos tecnológicos interessantes no campo da estrutura IPP incluem um exemplo de um driver do Windows para demonstrar a possibilidade de IPP no modo kernel, bem como uma versão do IPP para rodar em GPUs Intel integradas escritas em C para Metal .



É curioso que os números da versão do IPP primeiro foram na ordem de 1 a 9, e então começaram a ser designados no ano de lançamento - 2017-2020.





Equipe de desenvolvimento IPP da Intel em 2003



Durante a existência da família de bibliotecas IPP, mais de 100 pessoas participaram de seu trabalho - em Sarov, Nizhny Novgorod e Moscou. Agora, a sede do IPP está localizada em Nizhny Novgorod e parece muito atraente!





Decoração de piso IPP na Intel



IPP não é uma biblioteca primitiva de forma alguma!



Embora o nome Intel IPP contenha a palavra “primitivo”, e à primeira vista, não pode haver dificuldades fundamentais no conjunto de “peças de designer” para a criação de programas produtivos, que na verdade é IPP, a estrutura dessas bibliotecas não é nada trivial. Soluções tecnológicas interessantes foram aplicadas para garantir o máximo desempenho e usabilidade do IPP.



Como já mencionado, o IPP contém milhares de funções (e cada função tem várias versões otimizadas para uma arquitetura específica), o que leva a enormes tamanhos de bibliotecas prontas, o que não é de forma alguma um item na lista de benefícios para usuários de IPP.

Portanto, o IPP é coletado de uma maneira especial. Os arquivos fonte, que incluem um grande número de funções simples, são cortados por um script especial em muitos pequenos antes da compilação, uma função por arquivo. E então esses minifiles são compilados. Além disso, eles são compilados não uma, mas várias vezes - para diferentes arquiteturas com os sinalizadores correspondentes. O resultado são várias bibliotecas estáticas enormes - para cada domínio IPP. Mas essas bibliotecas estáticas são coladas a partir de arquivos de objetos muito pequenos. Portanto, quando o IPP está estaticamente vinculado a um aplicativo, o tamanho do aplicativo aumenta quase exatamente pelo tamanho das funções usadas do IPP, não mais bytes.



O IPP também possui um mecanismo para gerar bibliotecas personalizadas com base nas ferramentas existentes sem ter que abrir o código-fonte para os usuários. Ou seja, o usuário seleciona uma lista de funções de interesse dos arquivos de cabeçalho, após a qual uma pequena biblioteca dinâmica com apenas as funções necessárias e suas dependências é criada automaticamente por um script de enormes bibliotecas estáticas. Além disso, para reduzir ainda mais o tamanho, esta biblioteca dinâmica pode incluir opções de montagem para essas funções, não para todas as opções de hardware, mas exclusivamente para uma lista de plataformas especificada pelo usuário.



Em uma situação onde cada porcentagem adicional do desempenho das bibliotecas IPP importa, torna-se muito importante decidir em que nível paralelizar o código: dentro das funções da biblioteca, o que é bom para chamadas IPP de um thread de usuário, ou fora, no nível de aplicativos do usuário, o que é bom para aplicativos multithread que separam independentemente trabalho e dados para IPP.



Já que os aplicativos são diferentes e os IPPs também são diferentes. A saber, o pacote IPP inclui dois conjuntos de bibliotecas em versões de 32 e 64 bits: um é puramente single-threaded interno e o segundo é com paralelização interna de um número significativo de funções usando OpenMP (a lista exata de funções está anexada nos documentos anexos). Além disso, há outra versão para bibliotecas de processamento de imagem - a "Threading Layer", que é um complemento sobre IPP de thread único e usa OpenMP ou Intel TBB para paralelização externa de trabalho em imagens, que são divididas em fragmentos (blocos) para isso ... O código-fonte IPP Threading Layer está disponível no pacote IPP para aqueles que desejam ter mais controle sobre como seu código é executado simultaneamente.



Quase desde o início do IPP, os desenvolvedores tiveram que se preocupar com o problema de que os pipelines de processamento de imagem e sinal, consistindo em funções IPP individuais, estão executando mais lentamente do que gostariam. A explicação é simples: ao chamar funções IPP, via de regra, ocorre o carregamento e o descarregamento do cache ou mesmo da memória, e essa operação pode acabar sendo muito mais cara do que os próprios cálculos. Esse efeito é especialmente perceptível ao processar big data - não aqueles que são chamados de big data, mas, por exemplo, imagens FullHD (para não mencionar 4K).



A decisão de combinar várias funções dentro do IPP em uma, neste caso, não é adequada - então, em vez de blocos primitivos, obteremos detalhes sofisticados do jogo "Tetris", que será problemático para inserir nos aplicativos do usuário, e a variedade de tais combinações possíveis excederá todos os limites razoáveis.



Como resultado, um complemento C ++ sobre IPP foi implementado, que construiu gráficos de pipelines, cortou imagens em pedaços e, em seguida, lançou um loop paralelo que executou não uma operação em cada thread, mas todo o pipeline IPP em um bloco separado. No final, é claro, os resultados permaneceram juntos. Um protótipo foi feito primeiro e mostrou uma aceleração decente. Em seguida, foi criada uma configuração chamada DMIP (processamento de imagem de modo adiado). Além disso, em 2011, em uma das primeiras reuniões do comitê de padronização OpenVX em Khronos, o DMIP foi mencionado e calorosamente apoiado pelo comitê devido à popularidade dos gráficos entre os desenvolvedores de hardware. Portanto, o padrão OpenVX acabou se baseando na tecnologia de gráficos. Por várias razões, o padrão OpenVX não recebeu popularidade suficiente, mas agora o paradigma gráfico é suportado e desenvolvido pela equipe Intel Graph API.E como a API Graph está incluída no OpenCV, OpenVINO, Movidius SDK, há um impacto direto das tecnologias IPP nos padrões de visão computacional e APIs modernas.



IPP - links úteis



Mais uma vez, aqui estão os links mais importantes deste artigo.





Intel IPP Primeira Pessoa



Vamos dar a palavra às pessoas que desempenharam um papel importante no destino dos Intel Performance Primitives ao longo dos anos.



Vladimir Dudnik, chefe da equipe Intel IPP em 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