Esta sessão abordará a importância da computação paralela e otimização de código para obter o máximo desempenho tanto em processadores como em co-processadores. Serão abordados tópicos como conceitos de paralelismo, identificação de algoritmos paralelizáveis, importância da vetorização e multithreading
4. Introdução
Necessidade de maior poder computacional em
diversos setores
– Indústria & Universidades
• Previsão do tempo, clima
• Imagens médicas
• Óleo & Gás
• Bioinformática
• Simulações em diversas áreas
– Aeronáutica, automobilística, mecânica, financeira, telecomunicações,
etc.
– Aplicações mais rápidas que consomem menos energia
• Usuários de Smpartphones, Ultrabooks e Tablets não toleram
aplicativos “famintos” por bateria
• Otimizar o código leva ao uso ótimo da CPU, portanto,
gastando menos recursos do dispositivo4
5. Introdução
Como ganhar desempenho ?
– Utilizar 100% a capacidade do seu processador !
Processadores Multi-core e
Many-core
Unidade de Processamento
Vetorial
Multithreading
Vetorização
5
6. Introdução
SIMD Instruction Processor
AVX-512 Intel® Xeon Phi™ Prodruct Family
CORE-AVX2 4th Generation Intel® Core™ Processors
CORE-AVX-I 3rd Generation Intel® Core™ i7 Processors ; 3rd Generation Intel® Core™ i5 Processors
AVX 2nd Generation Intel® Core™ i7 Processors ; 2nd Generation Intel® Core™ i5 Processors ; 2nd
Generation Intel® Core™ i3 Processors ; Intel® Xeon® Processor E5 Family ;Intel® Xeon® Processor E3
Family
SSE4.2 Previous Generation Intel® Core™ i7 Processors ; Previous Generation Intel® Core™ i5 Processors ;
Previous Generation Intel® Core™ i3 Processors ; Intel® Xeon® 55XX series ; Intel® Xeon® 56XX series
Intel® Xeon® 75XX series ; Intel® Xeon® Processor E7 Family
ATOM_SSE4.2 Intel® Atom™ processors that support Intel® SSE4.2 instructions.
SSE4.1 Intel® Xeon® 74XX series ; Quad-Core Intel® Xeon 54XX, 33XX series ; Dual-Core Intel® Xeon 52XX,
31XX series ; Intel® Core™ 2 Extreme 9XXX series ; Intel® Core™ 2 Quad 9XXX series ; Intel® Core™ 2
Duo 8XXX series ; Intel® Core™ 2 Duo E7200
SSSE3 Quad-Core Intel® Xeon® 73XX, 53XX, 32XX series ; Dual-Core Intel® Xeon® 72XX, 53XX, 51XX, 30XX
series ; Intel® Core™ 2 Extreme 7XXX, 6XXX series ; Intel® Core™ 2 Quad 6XXX series ; Intel® Core™ 2
Duo 7XXX (except E7200), 6XXX, 5XXX, 4XXX series ; Intel® Core™ 2 Solo 2XXX series ; Intel® Pentium®
dual-core processor E2XXX, T23XX series
ATOM_SSSE3 Intel® Atom™ processors
SSE3 Dual-Core Intel® Xeon® 70XX, 71XX, 50XX Series ; Dual-Core Intel® Xeon® processor (ULV and LV) 1.66,
2.0, 2.16 ; Dual-Core Intel® Xeon® 2.8 ; Intel® Xeon® processors with SSE3 instruction set support
Intel® Core™ Duo ; Intel® Core™ Solo ; Intel® Pentium® dual-core processor T21XX, T20XX series ;
Intel® Pentium® processor Extreme Edition ; Intel® Pentium® D ; Intel® Pentium® 4 processors with
SSE3 instruction set support
SSE2 Intel® Xeon® processors ; Intel® Pentium® 4 processors ; Intel® Pentium® M
IA32 Intel® Pentium® III Processor ; Intel® Pentium® II Processor ; Intel® Pentium® Processor6
8. 8
for (i=0;i<=MAX;i++)
c[i]=a[i]+b[i];
+
c[i+7] c[i+6] c[i+5] c[i+4] c[i+3] c[i+2] c[i+1] c[i]
b[i+7] b[i+6] b[i+5] b[i+4] b[i+3] b[i+2] b[i+1] b[i]
a[i+7] a[i+6] a[i+5] a[i+4] a[i+3] a[i+2] a[i+1] a[i]
Vector
- Uma Instrução
- Oito operações
matemáticas1
1. Número de operações por instrução varia de acordo com a instrução SIMD utilizada (tamanho da instrução e operando)
+
C
B
A
Scalar
- Uma Instrução
- Uma Operação
Matemática
• O que é e ?
• Capacidade de realizar uma
operação matemática em dois ou
mais elementos ao mesmo tempo.
• Por que Vetorizar ?
• Ganho substancial em performance !
Introdução
9. Introdução
Multithreading
– Número de cores/threads/processador era de
uma unidade até 2004
– Atualmente os processadores possuem cada
vez mais cores/threads
– Ferramentas que facilitam uso de
multithreading
– Performance não é mais orientada a alta
frequência do processador
9
11. Do Multi-core para Many-Core
Muitas threads e “largos” registradores vetorias
Coprocessador Intel® Xeon® Phi™™ (KNC chip) Bottom
Servidor com 8 Coprocessadores Intel® Xeon® Phi™
(passive-cooling solution)
Coprocessador Intel® Xeon® Phi™
(KNC chip)
Coprocessador Intel® Xeon® Phi™
11
12. Contectado ao slot PCI-e
57+ cores por die
VPU / Core de 64-bits e registradores de 512-bit
Cada Core possuie 4 hardware threads
Processamento “In order”
L2 de 512KB/Core fully coherent (Least
Recently Used) 31MB para todos os cores
L1 de 32KB
Coprocessador Intel® Xeon® Phi™
12
13. Portabilidade do código
– Xeon® Phi™ é x86
– Aplicações existentes C/C++, Fortran pode
ser portadas para Xeon® Phi™
– Xeon® e Xeon® Phi™ suportamo mesmo
modelo de paralelismo
– Possuem as mesmas Ferramentas de
desenvolvimento e execução
Coprocessador Intel® Xeon® Phi™
13
14. Ferramentas
– Compiladores: Intel® C/C++ e Intel® Fortran
– Otimização: Intel® VTune Amplifier XE e
Intel® Trace Analyzer and Collector (ITAC)
– Bibliotecas matemáticas: Intel® Math Kernel
Library (MKL)
– Bibliotecas de execução paralela: Intel® MPI
e Intel® OpenMP
Coprocessador Intel® Xeon® Phi™
14
15. Arquitetura Xeon® Phi™
Integração com o Host
–Perspectiva do Desenvolvedor:
• Cada Xeon® Phi™ é um “nó” Linux
• Acessível via SSH (Secure Shell Protocol)
• Suporte a NFS (Network File Sharing
Protocol)
–MPSS – MIC Plataform Software Stack
• Drivers , Daemons, Comand Line e
Ferramentas Gráficas
• Boot, Load Linux, Enable node15
16. Xeon® Multi-Core
Centric
MIC – Many Core Centric
Multi-Core
Hosted
Aplicações Seriais
e Paralelas
Offload
Aplicações com
etapas
paralelas
Symmetric
Load
Balance
Many-Core
Hosted
Aplicações
Massivamente
Paralelas
• Computação Heterogênea
Coprocessador Intel® Xeon® Phi™
16
17. Arquitetura Xeon® Phi™
System Level Code
Linux/Windows Host
PCI-e Bus
Windows/
Linux OS
MPSS
Offload
Aplication
SSH
Intel® Xeon® Phi™ Coprocessor
System Level Code
PCI-e Bus
Linux uOS
Coprocessor
Communication and app-
launching support
Native
Aplication
Offload
Aplication
SSH Session
MIC Plataform Software Stack
17
19. 19
Multithreading em Memória Compartilhada
Memória compartilhada
Todos os processos compartilham um único
espaço de memória
Comunicação através de escrita e leitura de
variáveis compartilhadas
SMPs – Symmetric Multiprocessors
Fácil programação
Overhead na comunicação entre
processador e memória
20. 20
CPU[0] CPU[1] CPU[2]
RAM
I/O System
Multithreading em Memória Compartilhada
Difícil de escalar, pois quanto mais
processadores, mais overhead de
comunicação
21. Multithreading em Memória Compartilhada
Facilidade de Uso
Ajuste Fino
Threading
Intel® Math Kernel Library MPI
Intel® Threading Building Blocks
Intel® Cilk™ Plus
OpenMP
Pthreads
21
22. Multithreading em Memória Compartilhada
OpenMP Fortran 2008 Intel® TBB Intel® Cilk Plus
Site openmp.org fortranwiki.org opentbb.org cilkplus.org
Lançamento 1997 2010 2006 2010
Linguagens Fortan, C, C++ Fortran C++ C/C++
Descrição
Diretivas do
Compilador (pragmas),
runtime library
Extensão de
linguagem para
adicionar paralelismo
via
Extensão da linguagem para
adicionar paralelismo via
templates
Extensão da linguagem
para
multithreading/vetorização
Método Pragmas Keywords Templates
Keywords, atributos e
pragmas
Especificação By OpenMP ISO/IEC 1539-1:2010 Open Source iniciado pela Intel®
Especificação aberta
iniciada pela Intel®
Funcionalidades
Loops paralelos, tasks,
locks
Programação
paralela
Loops paralelos e algoritmos,
alocação de memória
Loops paralelos,
vetorização, array
notations, elemental
functions, compatível com
TBB
Funcionalidades
Únicas
Amplamente adotada
pela comunidade HPC
DO CONCURRENT,
Coarrays
Independente de compilador,
uso em vários tipos de
aplicações, alocação de
memória, suporte a outros
modelos de programação
paralela
Garantia de performance
em loadbalance,
vetorização, array notations
e elemental functions
22
23. API Padrão para memória compartilhada
Consiste em:
– Diretivas/Pragmas
– Runtime Library
• omp_set_num_threads(n)
– Variáveis de Ambiente
• OMP_NUM_THREADS
Importante:
– Uma Thread OpenMP para cada Core (ideal)
• Permite mais de uma thread/core
Multithreading em Memória Compartilhada
OpenMP
23
24. Execução de um programa OpenMP
Master Thread
Thread 1 Thread 2 Thread n-1 Thread n
Cada thread espera as outras
terminarem o trabalho – “wait state”
Master Thread
#pragma omp parallel
#pragma omp for
Thread pool
Multithreading em Memória Compartilhada
OpenMP
24
26. Scheduling mode
– static :
• Distribui tasks entre as threads antes do início do loop .
Menor overhead de comunicação, porém pode perder
performance no load-balance
– dynamic:
• Distribui parte da carga no início, e durante o loop as
tasks são distribuídas de acordo com a disponibilidade
– guided:
• Similar ao “dynamic”, porém a granularidade aumenta
assim que a carga de processamento diminui. Pode
resultar melhor load-balance
Multithreading em Memória Compartilhada
OpenMP
26
27. Multithreading em Memória Compartilhada
OpenMP
Scheduling mode
– Quanto maior o tamanho do bloco, menor
overhead, porém pior loadbalance
– Quanto menor o tamanho do bloco, maior
overhead, porém melhor loadbalance
– Ponto de partida para tamanho do bloco:
• > 1, menor que Num. Loops/Parallel Threads
Especificando modo “dynamic” e bloco com tamanho 4
#pragma omp parallel for schedule(dynamic, 4)
// ...
27
28. Reduction / Schedule
1. void SumColumns(const int m, const int n, long* M, long* s, char*
method){
2. for (int i = 0; i < m; i++) {
3. long sum = 0;
4. // Distribui cada linha entre as threads
5. // reduction para somar todas as colunas
6. #pragma omp parallel for schedule(guided)
reduction(+: sum)
7. for (int j = 0; j < n; j++)
8. sum += M[i*n+j];
9. s[i] = sum;
10. }
Multithreading em Memória Compartilhada
OpenMP
28
30. Vetorização
Como Vetorizar ?
– Cinco possíveis abordagens:
• Bibliotecas matemáticas
– Ex.: Intel® Math Kernel Library (MKL)
• Auto vetorização
– Trabalho a cargo do Compilador
• Diretivas/Pragmas
– SIMD
– IVDEP
– VECTOR E NOVECTOR
– Intel® Intrinsics
• Array Notation – Cilk Plus
– Notação vetorial na linguagem de programação explicitando a
vetorização
• Elemental Functions – Cilk Plus
– Vetorizar código existente mantendo sua modularidade
30
31. Vetorização
Como Vetorizar ?
Facilidade de Uso
Ajuste Fino
Vectors
Intel® Math Kernel Library
Array Notation: Intel® Cilk™ Plus
Auto vectorization
Semi-auto vectorization:
#pragma (vector, ivdep, simd)
C/C++ Vector Classes
(F32vec16, F64vec8)
31
32. Vetorização
Auto Vetorização
Ajudando o compilador a vetorizar
– Evitar “loop unrolling” manual pois:
• Atrela otimização a arquitetura de hardware (Vector Processor Unit)
• Prejudica a leitura do código
src1
[0]
src1
[1]
src1
[2]
src1
[3]
src2
acc1 acc2 acc3 acc4 acc
*
32
34. Vetorização
Auto Vetorização
Requisitos para um loop ser vetorizado
• Em loops encadeados, o loop mais interno será vetorizado
• Deve conter apenas blocos básicos, ex.: uma única linha de código sem
condições (if statements) ou saltos (go to)
• Quantidade de iterações do loop deve ser conhecida antes de sua
execução, mesmo que em tempo de execução
• Sem dependências entre os elementos a serem calculados
• GAP – Guided Autoparallelization (Intel® Compiler “-guide” ) pode ajudar
Loop Não Vetorizável – Dependência sobre a[i-1]
for (i=1; i<MAX; i++) {
d[i] = e[i] – a[i-1];
a[i] = b[i] + c[i];
}
34
35. Vetorização
Intel® C++ Intrinsic
O que é Intel® C++ Intrinsic ?
– Provê acesso a ISA (Instruction Set Architecture)
através de código C/C++ ao invés de código
Assembly
– Ganho de performance próximo a códigos
Assembly com a facilidade de C/C++
– Vetorização – Extensões SIMD (Simple
Instructions Multiple Data)
35
37. Vetorização
Diretivas & Parâmetros do Compilador
– Nem mesmo o mais fantástico compilador
consegue vetorizar automaticamente o código
– Ponteiros em C/C++ dificultam a vetorização
• Dois ponteiros podem apontar para o mesmo endereço
de memória
– Diretivas SIMD:
• Permissão ao compilador vetorizar
• Responsabilidade da vetorização é do programador
37
38. Vetorização
Diretivas & Parâmetros do Compilador
Diretivas:
#pragma simd [clause[ [,] clause] ... ] : guia o compilador para
casos onde a auto-vetorização não é possível
Atributos padrão:
VECTORLENGTH N : tamanho do vetor (2, 4, 8 ou 16)
VECTORLENGTHFOR (data-type) : tamanho_vetor/sizeof(type)
PRIVATE (VAR1[, VAR2]...) : variável privada para cada iteração do loop
FIRSTPRIVATE (VAR1[, VAR2]...) : broadcast do valor inicial a todas as outras instâncias para cada
iteração
LASTPRIVATE (VAR1[, VAR2]...) : broadcast do valor final a todas as outras instâncias
LINEAR (var1:step [, var2:step2]...) : incrementa número de steps para cada variável em um loop, unit-
stride vector
REDUCTION (oper:var1[, var2]...) : Aplica operação de redução (+, *, -, AND, OR, EQV, NEQV) nas
variáveis indicadas
ASSERT : Direciona o compilador a produzir um erro ou um warning quando a vetorização falha
38
39. Vetorização
Diretivas & Parâmetros do Compilador
Alinhamento de dados
#pragma vector aligned | unaligned : comunica ao compilador que os dados
estão alinhados
__assume_aligned keyword : elimita checagem se os dados estão alinhados,
porém e´specífico para cada vetor
__attribute__((aligned(64)) ou __mm_malloc() / __mm__free() : alocação
estática e dinâmica de dados alinhados
-opt-assume-safe-padding : completa os vetores com bytes extras para que
fiquem múltiplos do tamanho da cache. Evita “loop sobressalente”
39
40. Vetorização
Diretivas & Parâmetros do Compilador
Removendo “Pointer Aliasing”
#pragma ivdep : Ignora dependências de variáveis
“restrict” ou “-restrict (argumento de linha de
comando) : similar a “ivdep” , informa que determinada
variável não possui restrições/dependências
“Streaming Store”
#pragma vector nontemporal | temporal ou “-opt-
streaming-store always” : uso ótimo do cache em casos de write-only
onde os dados não precisam ser armazenados na cache, e sim diretamente na
memória. Usar “vector aligned” antes.
40
41. Vetorização
Diretivas & Parâmetros do Compilador
#pragma loop count : Informa ao compilador o número de loops . Útil para
melhores predições de vetorização
-vec-report[n] : relatório do que foi e do que pode ser vetorizado . “n”
determina o nível de detalhes
-guide : GAP – Guided Auto-parallelization . Sugestões de como vetorizar os
loops
-O[n] : Nível de otimização O2 (default) já inclui auto-vetorização
-x[code] : Otimiza as instruções de acordo com a arquitetura do processador.
Ex.: -xAVX , -xSSE2
#pragma novector : Instrui o compilador a não vetorizar. Útil em loops com
muitas condições (ifs)
#pragma vector always : força vetorização automática independente da
heurística do compilador
41
48. Conclusões
Fatos
– Há muita computacional na indústria e nas
universidades
– No mundo desktop e mobile há muito espaço
para otimizações
– Existem ferramentas que facilitam a
programação paralela
– Multithreading e Vetorização são suportados
pelos processadores atuais
48
49. Conclusões
Técnicas de Otimização
– Multithreading
• Explorar multiplos cores por processador,
múltiplas threads por core
• Já passou da fase de tendência, hoje é realidade !
– Vetorização
• Outra forma de paralelismo “data paralelism”
• Processamento Vetorial disponível em
smpartphones, ultrabooks e servidores
49
50. • Arquitetura, setup e recursos de
programação
• Treinamentos
• Estudos de caso
• Informações sobre as
Ferramentas
• Suporte através da comunidade
(fóruns de discussão, artigos,
etc.)
50
Intel®® Xeon® Phi™™ COPROCESSOR DEVELOPER SITE
http://software.intel.com/mic-developer/
Links Importantes
51. Vetorização:
• http://software.intel.com/en-us/intel-vectorization-tools
Treinamentos:
• An Overview of Programming for Intel®® Xeon®® processors and Intel®® Xeon® Phi™™ coprocessors
• Intel®® Xeon® Phi™™ Coprocessor Developer’s Quick Start Guide
• http://software.intel.com/mic-developer
• The Training tab has Beginner and Advanced workshop videos, and links to past/future webinars
• The Tools & Downloads tab has a link to Intel® and Third Party Tools and Libraries
• This page has links to available beta and production for developers
51
Links Importantes
52. Intel® Advisor XE 2013
Informações: software.intel.com/en-us/intel-advisor-xe
Video de demonstração: insidehpc.com/2012/11/30/demo-intel-advisor-xe-2013-transforms-code-for-intel-Xeon®-phi-at-sc12/
Intel® Parallel Studio XE
Informações: software.intel.com/en-us/intel-parallel-studio-xe
Video de demonstração: insidehpc.com/2012/11/28/video-intel-parallel-studio-xe-demo-at-sc12/
Intel® Cluster Studio XE
Informações: software.intel.com/en-us/intel-cluster-studio-xe
Video de demonstração: insidehpc.com/2012/11/29/intel-cluster-studio-xe-demo-at-sc12/
James Reinders on Exploiting Parallelism
in the new Intel®® Xeon® Phi™™ coprocessors
youtube.com/watch?v=g9ehO6duNuE&list=UUH5Rft7GYM8KZpxA-4Ohihg&index=9&feature=plcp
Ferramentas de Desenvolvimento Intel® para o
coprocessador Intel® Xeon® Phi™ coprocessor
Links Importantes
52