Palestra realizada por Igor Freitas no Intel Software Day 2013 (22/10/2013)
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
4
• 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 dispositivo
5. Introdução
Como ganhar desempenho ?
– Utilizar 100% a capacidade do seu processador !
Processadores Multi-core e
Many-core
Unidade de Processamento
Vetorial
5
Multithreading
Vetorização
6. Introdução
SIMD Instruction
Processor
AVX-512
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
6
Intel® Xeon Phi™ Prodruct Family
Intel® Xeon® processors ; Intel® Pentium® 4 processors ; Intel® Pentium® M
IA32
Intel® Pentium® III Processor ; Intel® Pentium® II Processor ; Intel® Pentium® Processor
8. Introdução
• 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 !
A
+
B
Scalar
- Uma Instrução
- Uma Operação
Matemática
C
for (i=0;i<=MAX;i++)
c[i]=a[i]+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]
+
b[i+7] b[i+6] b[i+5] b[i+4] b[i+3] b[i+2] b[i+1] b[i]
c[i+7]
c[i+6]
c[i+5]
c[i+4]
c[i+3]
c[i+2]
c[i+1]
Vector
- Uma Instrução
- Oito operações
matemáticas1
c[i]
1. Número de operações por instrução varia de acordo com a instrução SIMD utilizada (tamanho da instrução e operando)
8
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. Coprocessador Intel® Xeon® Phi™
Do Multi-core para Many-Core
Muitas threads e “largos” registradores vetorias
Coprocessador Intel® Xeon® Phi™™ (KNC chip) Bottom
Coprocessador Intel® Xeon® Phi™
(KNC chip)
11
Servidor com 8 Coprocessadores Intel® Xeon® Phi™
(passive-cooling solution)
12. Coprocessador Intel® Xeon® Phi™
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
12
13. Coprocessador Intel® Xeon® Phi™
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
13
14. Coprocessador Intel® Xeon® Phi™
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
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 node
15
16. Coprocessador Intel® Xeon® Phi™
• Computação Heterogênea
Xeon® Multi-Core
Centric
Multi-Core
Hosted
Aplicações Seriais
e Paralelas
16
Offload
Aplicações com
etapas
paralelas
MIC – Many Core Centric
Symmetric
Load
Balance
Many-Core
Hosted
Aplicações
Massivamente
Paralelas
17. Arquitetura Xeon® Phi™
MIC Plataform Software Stack
Linux/Windows Host
Intel® Xeon® Phi™ Coprocessor
SSH Session
Offload
Aplication
SSH
System Level Code
System Level Code
Coprocessor
Communication and applaunching support
MPSS
PCI-e Bus
Windows/
Linux OS
17
Offload
Aplication
Native
Aplication
PCI-e Bus
Linux uOS
19. Multithreading em Memória Compartilhada
Memória compartilhada
Comunicação através de escrita e leitura de
variáveis compartilhadas
19
Todos os processos compartilham um único espaço
de memória
SMPs – Symmetric Multiprocessors
Fácil programação
Overhead na comunicação entre processador
e memória
20. Multithreading em Memória Compartilhada
Difícil de escalar, pois quanto mais
processadores, mais overhead de comunicação
CPU[0]
CPU[1]
CPU[2]
I/O System
RAM
20
21. Multithreading em Memória Compartilhada
Facilidade de Uso
Threading
Intel® Math Kernel Library MPI
Intel® Threading Building Blocks
Intel® Cilk™ Plus
OpenMP
Pthreads
Ajuste Fino
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®
Programação
paralela
Loops paralelos e algoritmos,
alocação de memória
Loops paralelos,
vetorização, array
notations, elemental
functions, compatível com
TBB
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
Funcionalidades
Funcionalidades
Únicas
22
Loops paralelos, tasks,
locks
Amplamente adotada
pela comunidade HPC
23. Multithreading em Memória Compartilhada
OpenMP
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
23
24. Multithreading em Memória Compartilhada
OpenMP
Execução de um programa OpenMP
Master Thread
#pragma omp parallel
Thread pool
Thread 1
Thread 2
Thread n-1
Thread n
#pragma omp for
Cada thread espera as outras
terminarem o trabalho – “wait state”
24
Master Thread
26. Multithreading em Memória Compartilhada
OpenMP
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
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
Especificando modo “dynamic” e bloco com tamanho 4
#pragma omp parallel for schedule(dynamic, 4)
// ...
– Ponto de partida para tamanho do bloco:
• > 1, menor que Num. Loops/Parallel Threads
27
28. Multithreading em Memória Compartilhada
OpenMP
Reduction / Schedule
1.
2.
3.
4.
5.
6.
7.
8.
void SumColumns(const int m, const int n, long* M, long* s, char*
method){
for (int i = 0; i < m; i++) {
long sum = 0;
// Distribui cada linha entre as threads
// reduction para somar todas as colunas
#pragma omp parallel for schedule(guided)
reduction(+: sum)
for (int j = 0; j < n; j++)
sum += M[i*n+j];
9. s[i] = sum;
10. }
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
Vectors
Intel® Math Kernel Library
Auto vectorization
Array Notation: Intel® Cilk™ Plus
Semi-auto vectorization:
#pragma (vector, ivdep, simd)
C/C++ Vector Classes
(F32vec16, F64vec8)
Ajuste Fino
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
32
acc2
acc3
acc4
acc
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 “-optstreaming-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. Links Importantes
Intel®® Xeon® Phi™™ COPROCESSOR DEVELOPER SITE
•
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.)
http://software.intel.com/mic-developer/
50
51. Links Importantes
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
52. Links Importantes
Ferramentas de Desenvolvimento Intel® para o
coprocessador Intel® Xeon® Phi™ coprocessor
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
52