4  Introdução à Programação Paralela: Vetorização

– Guilherme A. Lopes

Resumo: Neste minicurso, exploraremos técnicas de vetorização e sua importância para o desenvolvimento de software de alto desempenho. Abordaremos desde conceitos básicos até a implementação prática de operações SIMD (Single Instruction, Multiple Data), demonstrando como otimizar o processamento de dados em paralelo. O foco será na utilização eficiente das extensões vetoriais modernas, como AVX e SSE, disponíveis nos processadores atuais, usando immutible.h.

Texto do Minicurso de Vetorização.

4.1 Introdução

4.2 Vetorização

A vetorização é extremamente importante nos dias de hoje. Embora os compiladores abstraiam muitos aspectos do funcionamento do hardware, é possível instruí-los a utilizar instruções SIMD (Single Instruction, Multiple Data) para obter ganhos de desempenho em operações matriciais. O objetivo deste minicurso é ensinar os estudantes a utilizarem operações de vetorização para obter ganhos significativos de desempenho em software. A vetorização é muito aplicada atualmente em diversar áreas: aplicações científicas, análise financeira, Inteligência Artificial (IA)/aprendizado profundo, modelagem, análise 3D, Processamento de Imagens e áudio/vídeo, criptografia e compressão de dados.

4.3 Suporte do Hardware

Intel AVX

AVX, ou Advanced Vector Extensions, são extensões de vetor SIMD (Single Instruction, Multiple Data) de 256 bits para processadores Intel e AMD que usam a arquitetura x86. Estas extensões permitem que os processadores executem operações matemáticas mais complexas e intensivas em dados de forma mais eficiente, acelerando o desempenho em aplicações que lidam com grandes conjuntos de dados, como processamento de imagem, vídeo, IA, entre outras. Em resumo:

O quê: Extensões de vetor SIMD que permitem processar múltiplos dados com uma única instrução.

Para quê: Acelerar operações em aplicações que lidam com grandes conjuntos de dados. Como: Adicionam novas instruções e registadores, permitindo processar mais dados por ciclo de clock. Exemplos de uso: Processamento de imagem, vídeo, IA, análise de dados, simulações científicas. AVX2 e AVX-512: AVX2 expande o suporte para 256 bits e AVX-512 para 512 bits, com novas instruções e funcionalidades.

Mais Detalhes:

AVX: Foi introduzida pela Intel em 2011, com a microarquitetura Sandy Bridge.

AVX2: Introduzida em 2013, com a microarquitetura Haswell, expande as operações para 256 bits. AVX-512: Introduzida em 2016, com o coprocessador Knights Landing, e em 2017, com processadores Skylake, expande as operações para 512 bits, com novas instruções e uma nova codificação de prefixo EVEX. Benefícios: Aceleração do desempenho, maior eficiência em cálculos intensivos, suporte para uma gama mais ampla de aplicações. Como verificar o suporte AVX: É possível verificar as especificações do processador no site da Intel ou da AMD para verificar se suporta AVX, AVX2 ou AVX-512.

4.4 Intrisics do GCC

4.5 Suporte do OpenMP?

A Vetorização também pode ser implementada usando por meio de deretiva de compilação ” #pragma omp parallel for”, como mostrado no exemplo abaixo:

#include #include #include <omp.h>

int main() { std::vector arr = {0,1,2,3,4,5,6,7,8,9}; int sum = 0;

#pragma omp parallel for reduction(+:sum)
for(size_t i = 0; i < arr.size(); i++) {
    sum += arr[i];
    std::cout << "Thread " << omp_get_thread_num() 
              << " processou arr[" << i << "] = " << arr[i] << "\n";
}

std::cout << "Soma total: " << sum << std::endl;
return 0;

}

Usar immutable.h traz algumas vatagens comparado ao OpenMP,dentre elas a segurança das threads, visto que os dados trabalhados são imutaveis, evitando inconsistência em condição de disputa. Ao mesmo tempo ao meu ver reduz a complexidade do codigo fonte. Permitindo trabalhar de forma clara com aspectos mais baixo nível do hardaware, permitindo um melhor aproveitando dos recursos computacionais

4.6 Considerações Finais

4.7 Referências

“A Gentle Introduction to LLVM IR · Mcyoung — Mcyoung.xyz.” https://mcyoung.xyz/2023/08/01/llvm-ir/.
Espressif-Systems. 2025. ESP-IDF Programming Guide. https://docs.espressif.com/projects/esp-idf/en/latest/esp32/index.html.
“Getting Started with the LLVM System &#X2014; LLVM 22.0.0git Documentation — Llvm.org.” https://llvm.org/docs/GettingStarted.html.
“GitHub - Banach-Space/Llvm-Tutor: A Collection of Out-of-Tree LLVM Passes for Teaching and Learning — Github.com.” https://github.com/banach-space/llvm-tutor/.
“GitHub - Sampsyo/Llvm-Pass-Skeleton: Example LLVM Pass — Github.com.” https://github.com/sampsyo/llvm-pass-skeleton.
Knuth, Donald E. 1984. “Literate Programming.” Comput. J. 27 (2): 97–111. https://doi.org/10.1093/comjnl/27.2.97.
“LLVM for Grad Students — Cs.cornell.edu.” https://www.cs.cornell.edu/~asampson/blog/llvm.html.
“LLVM Language Reference Manual &#X2014; LLVM 22.0.0git Documentation — Llvm.org.” https://llvm.org/docs/LangRef.html.
“LLVM Loop Terminology (and Canonical Forms) &#X2014; LLVM 22.0.0git Documentation — Llvm.org.” https://llvm.org/docs/LoopTerminology.html.
“LLVM: Include/Llvm/IR/DerivedTypes.h Source File — Llvm.org.” https://llvm.org/doxygen/DerivedTypes_8h_source.html.
“LLVM: Llvm::LLVMContext Class Reference — Llvm.org.” https://llvm.org/doxygen/classllvm_1_1LLVMContext.html.
“LLVM: Llvm::Module Class Reference — Llvm.org.” https://llvm.org/doxygen/classllvm_1_1Module.html.
“[LLVMdev] The Name of LLVM — Lists.llvm.org.” https://lists.llvm.org/pipermail/llvm-dev/2011-December/046445.html.
“LLVM&#x2019;s Analysis and Transform Passes &#X2014; LLVM 22.0.0git Documentation — Llvm.org.” https://llvm.org/docs/Passes.html#loops-natural-loop-information.
Maziero, Prof. Carlos A. 2019. Sistemas Operacionais:conceitos e Mecanismos.
Richard Barry, The FreeRTOS Team. 2025. Mastering the FreeRTOS™ Real Time Kernel. https://www.freertos.org/Documentation/02-Kernel/07-Books-and-manual/01-RTOS_book.
“The Architecture of Open Source Applications (Volume 1)LLVM — Aosabook.org.” https://aosabook.org/en/v1/llvm.html.
“The LLVM Compiler Infrastructure Project — Llvm.org.” http://llvm.org/.
“The Often Misunderstood GEP Instruction &#X2014; LLVM 22.0.0git Documentation — Llvm.org.” https://llvm.org/docs/GetElementPtr.html.
“Using the New Pass Manager &#X2014; LLVM 22.0.0git Documentation — Llvm.org.” https://llvm.org/docs/NewPassManager.html.
“Writing an LLVM Pass &#X2014; LLVM 22.0.0git Documentation — Llvm.org.” https://llvm.org/docs/WritingAnLLVMNewPMPass.html.
“Yet Another Brainfuck Reference. — Brainfuck.org.” https://brainfuck.org/brainfuck.html.