computação paralela e otimização. vetorização e multithreading (igor freitas)

55
Computação Paralela & Otimização Vetorização e Multithreading Igor José F. Freitas [email protected]

Upload: intel-software-brasil

Post on 24-May-2015

252 views

Category:

Technology


3 download

DESCRIPTION

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.

TRANSCRIPT

Page 1: Computação Paralela e Otimização. Vetorização e Multithreading (Igor Freitas)

Computação Paralela & Otimização Vetorização e Multithreading

Igor José F. Freitas

[email protected]

Page 2: Computação Paralela e Otimização. Vetorização e Multithreading (Igor Freitas)

Principais pontos abordados

Introdução ao Coprocessador Intel® Xeon® Phi™

Vetorização de código (Atom® ao Xeon® Phi™ )

Multithreading

– OpenMP

2

Page 3: Computação Paralela e Otimização. Vetorização e Multithreading (Igor Freitas)

Agenda

Introdução

Coprocessador Xeon® Phi™

Multithreading em Memória Compartilhada

Vetorização

Conclusões

Dúvidas

3

Page 4: Computação Paralela e Otimização. Vetorização e Multithreading (Igor Freitas)

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

Page 5: Computação Paralela e Otimização. Vetorização e Multithreading (Igor Freitas)

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

Page 6: Computação Paralela e Otimização. Vetorização e Multithreading (Igor Freitas)

IntroduçãoSIMD 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 seriesIntel® 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 supportIntel® 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

Page 7: Computação Paralela e Otimização. Vetorização e Multithreading (Igor Freitas)

Introdução

Processamento Vetorial

– Instruções SIMD

Histórico das instruções SIMD – Processadores Intel®

7

Page 8: Computação Paralela e Otimização. Vetorização e Multithreading (Igor Freitas)

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çõesmatemá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çãoMatemá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

Page 9: Computação Paralela e Otimização. Vetorização e Multithreading (Igor Freitas)

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

Page 10: Computação Paralela e Otimização. Vetorização e Multithreading (Igor Freitas)

Introdução

Computação Paralela & Otimização– Aplicada em:

• Clusters de Alto Desempenho (HPC)– Xeon® & Xeon® Phi™

• Microservers (Avotom – Atom ™)– Intel® Atom™ processor C2000 (Avotom )

• Desktops– Intel ® Core ™

• Mobile (Smartphones & Tablets)– Bay Trail ™, Clover Trail+ ™

10

Page 11: Computação Paralela e Otimização. Vetorização e Multithreading (Igor Freitas)

Do Multi-core para Many-CoreMuitas 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

Page 12: Computação Paralela e Otimização. Vetorização e Multithreading (Igor Freitas)

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

Page 13: Computação Paralela e Otimização. Vetorização e Multithreading (Igor Freitas)

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

Page 14: Computação Paralela e Otimização. Vetorização e Multithreading (Igor Freitas)

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

Page 15: Computação Paralela e Otimização. Vetorização e Multithreading (Igor Freitas)

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

Page 16: Computação Paralela e Otimização. Vetorização e Multithreading (Igor Freitas)

Xeon® Multi-CoreCentric

MIC – Many Core Centric

Multi-Core Hosted

Aplicações Seriais e Paralelas

OffloadAplicações com

etapas paralelas

SymmetricLoad

Balance

Many-Core Hosted

Aplicações Massivamente

Paralelas

• Computação Heterogênea

Coprocessador Intel® Xeon® Phi™

16

Page 17: Computação Paralela e Otimização. Vetorização e Multithreading (Igor Freitas)

Arquitetura Xeon® Phi™

System Level Code

Linux/Windows Host

PCI-e BusWindows/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

OffloadAplication

SSH Session

MIC Plataform Software Stack

17

Page 18: Computação Paralela e Otimização. Vetorização e Multithreading (Igor Freitas)

Multithreading em Memória Compartilhada

18

Page 19: Computação Paralela e Otimização. Vetorização e Multithreading (Igor Freitas)

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

Page 20: Computação Paralela e Otimização. Vetorização e Multithreading (Igor Freitas)

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

Page 21: Computação Paralela e Otimização. Vetorização e Multithreading (Igor Freitas)

Multithreading em Memória Compartilhada

Facilidade de Uso

Ajuste Fino

Threading

Intel® Math Kernel Library MPI

Intel® Threading Building BlocksIntel® Cilk™ Plus

OpenMP

Pthreads

21

Page 22: Computação Paralela e Otimização. Vetorização e Multithreading (Igor Freitas)

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çãoDiretivas 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 TemplatesKeywords, atributos e pragmas

Especificação By OpenMP ISO/IEC 1539-1:2010 Open Source iniciado pela Intel®Especificação aberta iniciada pela Intel®

FuncionalidadesLoops paralelos, tasks, locks

Programaçãoparalela

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

Page 23: Computação Paralela e Otimização. Vetorização e Multithreading (Igor Freitas)

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

Page 24: Computação Paralela e Otimização. Vetorização e Multithreading (Igor Freitas)

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

Page 25: Computação Paralela e Otimização. Vetorização e Multithreading (Igor Freitas)

Multithreading em Memória Compartilhada OpenMP

Paralelizando um Loop

1. double res[200]; int i;2. #pragma omp parallel for3. for (i=0;i< 200; i++) {4. res[i] = foo();5. }

Thread 1res[0] = foo();res[1] = foo();res[2] = foo();res[3] = foo();

Thread 2res[4] = foo();res[5] = foo();res[6] = foo();res[7] = foo();

Thread Nres[MAX-3] = foo();res[MAX-2] = foo();res[MAX-1] = foo();res[MAX] = foo();

...

25

Page 26: Computação Paralela e Otimização. Vetorização e Multithreading (Igor Freitas)

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

Page 27: Computação Paralela e Otimização. Vetorização e Multithreading (Igor Freitas)

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

Page 28: Computação Paralela e Otimização. Vetorização e Multithreading (Igor Freitas)

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 threads5. // reduction para somar todas as colunas6. #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

Page 29: Computação Paralela e Otimização. Vetorização e Multithreading (Igor Freitas)

Task Parallelism em Memória Compartilhada OpenMP

Performance – OpenMP Scheduling modes - Jacobi solver

29

Page 30: Computação Paralela e Otimização. Vetorização e Multithreading (Igor Freitas)

VetorizaçãoComo 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

Page 31: Computação Paralela e Otimização. Vetorização e Multithreading (Igor Freitas)

VetorizaçãoComo 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

Page 32: Computação Paralela e Otimização. Vetorização e Multithreading (Igor Freitas)

VetorizaçãoAuto 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

Page 33: Computação Paralela e Otimização. Vetorização e Multithreading (Igor Freitas)

VetorizaçãoAuto Vetorização

Unrolling Loop

1. double acc1 = 0, accu2 = 0, acc3 = 0, acc4 =0;2. for (i=0; i<NUM; i+=4) {3. acc1 = src1[i+0] * src2 + acc1;4. acc2 = src1[i+1] * src2 + acc1;5. acc3 = src1[i+2] * src2 + acc1;6. acc4 = src1[i+3] * src2 + acc1;7. }8. accu = acc1 + acc2 + acc3 + acc4;

Forma simplificada

double acc = 0;for (i=0; i<NUM; i+=4) {

accu = src1[i]*src2 + accu;}

33

Page 34: Computação Paralela e Otimização. Vetorização e Multithreading (Igor Freitas)

VetorizaçãoAuto 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

Page 35: Computação Paralela e Otimização. Vetorização e Multithreading (Igor Freitas)

VetorizaçãoIntel® 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

Page 36: Computação Paralela e Otimização. Vetorização e Multithreading (Igor Freitas)

VetorizaçãoIntel® C++ Intrinsic

MIC Intrinsics

SSE Intrinsics

36

Page 37: Computação Paralela e Otimização. Vetorização e Multithreading (Igor Freitas)

VetorizaçãoDiretivas & 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

Page 38: Computação Paralela e Otimização. Vetorização e Multithreading (Igor Freitas)

VetorizaçãoDiretivas & Parâmetros do Compilador

Diretivas:

#pragma simd [clause[ [,] clause] ... ] : guia o compilador para casos onde a auto-vetorização não é possívelAtributos 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

Page 39: Computação Paralela e Otimização. Vetorização e Multithreading (Igor Freitas)

VetorizaçãoDiretivas & 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

Page 40: Computação Paralela e Otimização. Vetorização e Multithreading (Igor Freitas)

VetorizaçãoDiretivas & 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

Page 41: Computação Paralela e Otimização. Vetorização e Multithreading (Igor Freitas)

VetorizaçãoDiretivas & 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

Page 42: Computação Paralela e Otimização. Vetorização e Multithreading (Igor Freitas)

VetorizaçãoElemental Functions

Possibilita chamar versão vetorizada da

função escalar

Excelente em casos onde as funções estão

implementadas em biblioteca de terceiros

42

Page 43: Computação Paralela e Otimização. Vetorização e Multithreading (Igor Freitas)

VetorizaçãoElemental Functions

Lib Xfloat my_simple_add(float x1,float x2){

return x1 + x2;}

Elemental Function

__attribute__(vector) float my_simple_add(float x1, float x2);

// ...em outro arquivo de código#pragma simdfor (int i=0; i < N, ++i) {

output[i] = my_simple_add(inputa[i], inputb[i]);}

Oumy_simple_add(inputa[:], inputb[:]);

43

Page 44: Computação Paralela e Otimização. Vetorização e Multithreading (Igor Freitas)

VetorizaçãoArray Notation

Extensões C++ Intel® Cilk Plus para

operações com vetores

Indica paralelismo para vetorização

automática

44

Page 45: Computação Paralela e Otimização. Vetorização e Multithreading (Igor Freitas)

VetorizaçãoArray Notation

A[:] += B[:]; // todo o vetor é computado

A[0:16] += B[32:16]; // A(0 até 15) + B(32 até 47)

A[0:16:2] += B[32:16:4] // A(0, 2, 4, ...30) + B(32, 36, 38, ...

92)

Compatibilidade com compiladores não-Intel

#ifdef __INTEL_COMPILERA[:] += B[:];

#elsefor (int i=0; i<16; i++)

A[i] += B[i];#endif

45

Page 46: Computação Paralela e Otimização. Vetorização e Multithreading (Igor Freitas)

VetorizaçãoExemplos

Diretivas SIMD Adição de vetores – C/C++

1.__declspec(align(16)) float a[MAX], b[MAX], c[MAX];

2.#pragma simd

3.for (i=0; i<MAX; i++)

4. c[i] = a[i]+b[i];

Array Notation Cilk PlusAdição de vetores – C/C++ - Dados alinhados

1.__declspec(align(16)) float a[MAX], b[MAX], c[MAX];

2.c[i:MAX] = a[i:MAX]+b[i:MAX];46

Page 47: Computação Paralela e Otimização. Vetorização e Multithreading (Igor Freitas)

VetorizaçãoExemplos

Array Notation Cilk PlusAdição de vetores – C/C++ - Dados alinhados

1.__declspec(align(16)) float a[MAX], b[MAX], c[MAX];

2.__declspec(vector(uniform(B,C), linear(i:1)))

3.float foo(float* B, float *C, int i){

4. return B[i]+C[i];

5.}

6....

7.for (i=0; i<MAX; i++) {

8. a[i] = foo(b,c,i);

9.}

47

Page 48: Computação Paralela e Otimização. Vetorização e Multithreading (Igor Freitas)

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

Page 49: Computação Paralela e Otimização. Vetorização e Multithreading (Igor Freitas)

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

Page 50: Computação Paralela e Otimização. Vetorização e Multithreading (Igor Freitas)

• 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

Page 51: Computação Paralela e Otimização. Vetorização e Multithreading (Igor Freitas)

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

Page 52: Computação Paralela e Otimização. Vetorização e Multithreading (Igor Freitas)

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

Page 53: Computação Paralela e Otimização. Vetorização e Multithreading (Igor Freitas)

Nota sobre Otimização

Page 54: Computação Paralela e Otimização. Vetorização e Multithreading (Igor Freitas)

• INFORMATION IN THIS DOCUMENT IS PROVIDED IN CONNECTION WITH INTEL PRODUCTS. NO LICENSE, EXPRESS OR IMPLIED, BY ESTOPPEL OR OTHERWISE, TO ANY INTELLECTUAL PROPERTY RIGHTS IS GRANTED BY THIS DOCUMENT. EXCEPT AS PROVIDED IN INTEL'S TERMS AND CONDITIONS OF SALE FOR SUCH PRODUCTS, INTEL ASSUMES NO LIABILITY WHATSOEVER AND INTEL DISCLAIMS ANY EXPRESS OR IMPLIED WARRANTY, RELATING TO SALE AND/OR USE OF INTEL PRODUCTS INCLUDING LIABILITY OR WARRANTIES RELATING TO FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR INFRINGEMENT OF ANY PATENT, COPYRIGHT OR OTHER INTELLECTUAL PROPERTY RIGHT.

• A "Mission Critical Application" is any application in which failure of the Intel Product could result, directly or indirectly, in personal injury or death. SHOULD YOU PURCHASE OR USE INTEL'S PRODUCTS FOR ANY SUCH MISSION CRITICAL APPLICATION, YOU SHALL INDEMNIFY AND HOLD INTEL AND ITS SUBSIDIARIES, SUBCONTRACTORS AND AFFILIATES, AND THE DIRECTORS, OFFICERS, AND EMPLOYEES OF EACH, HARMLESS AGAINST ALL CLAIMS COSTS, DAMAGES, AND EXPENSES AND REASONABLE ATTORNEYS' FEES ARISING OUT OF, DIRECTLY OR INDIRECTLY, ANY CLAIM OF PRODUCT LIABILITY, PERSONAL INJURY, OR DEATH ARISING IN ANY WAY OUT OF SUCH MISSION CRITICAL APPLICATION, WHETHER OR NOT INTEL OR ITS SUBCONTRACTOR WAS NEGLIGENT IN THE DESIGN, MANUFACTURE, OR WARNING OF THE INTEL PRODUCT OR ANY OF ITS PARTS.

• Intel may make changes to specifications and product descriptions at any time, without notice. Designers must not rely on the absence or characteristics of any features or instructions marked "reserved" or "undefined". Intel reserves these for future definition and shall have no responsibility whatsoever for conflicts or incompatibilities arising from future changes to them. The information here is subject to change without notice. Do not finalize a design with this information.

• The products described in this document may contain design defects or errors known as errata which may cause the product to deviate from published specifications. Current characterized errata are available on request.

• Intel processor numbers are not a measure of performance. Processor numbers differentiate features within each processor family, not across different processor families. Go to: http://www.intel.com/products/processor_number.

• Contact your local Intel sales office or your distributor to obtain the latest specifications and before placing your product order.• Copies of documents which have an order number and are referenced in this document, or other Intel literature, may be obtained by calling 1-

800-548-4725, or go to: http://www.intel.com/design/literature.htm• Intel, Core, Atom, Pentium, Intel inside, Sponsors of Tomorrow, Pentium, 386, 486, DX2 and the Intel logo are trademarks of Intel Corporation in

the United States and other countries.

• *Other names and brands may be claimed as the property of others.• Copyright ©2012 Intel Corporation.

Legal Disclaimer

Page 55: Computação Paralela e Otimização. Vetorização e Multithreading (Igor Freitas)