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.