Buscar

Aula 09 Registradores vetoriais

Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original

Registradores Vetoriais
Marcelo Zamith
e-email:zamith.marcelo@gmail.com
Universidade Federal Rural do Rio de Janeiro - DCC
2016.1
Roteiro
Introdução
Registradores vetoriais
Programando registradores vetoriais
Introdução
Registradores vetoriais
Introdução
Era uma vez...
1997 - Arquitetura dos processadores Pentium com tecnologia MMX - Multi Media Extensions.
1999 - Instruções SSE (Streaming SIMD Extensions) - Pentium III - 8 Registradores de 128 bits.
2001 - 144 novas instruções chamadas de SSE2 nos processadores da Intel.
2003 - Endereçamento de 64bits - Processadores da AMD.
▸ Aumento para 16 registradores de 128bits - SSE.
2004 - Intel incorpora o SS3 - 13 novas instruções:
▸ Aritmética de números complexos.▸ Operações gráficas.▸ Video encoding.
2006 - SSE4 com 54 novas instruções anunciadas pela intel.
2007 - 46 instruções adicionadas com SSE5.
2011 - registradores de 256bits e estende SSE - Advanced Vector Extensions (AVX).
2013 - Extensão dos registradores de 256bits para 512bits - Advanced Vector Extensions (AVX2).
Introdução
Era uma vez...
1997 - Arquitetura dos processadores Pentium com tecnologia MMX - Multi Media Extensions.
1999 - Instruções SSE (Streaming SIMD Extensions) - Pentium III - 8 Registradores de 128 bits.
2001 - 144 novas instruções chamadas de SSE2 nos processadores da Intel.
2003 - Endereçamento de 64bits - Processadores da AMD.
▸ Aumento para 16 registradores de 128bits - SSE.
2004 - Intel incorpora o SS3 - 13 novas instruções:
▸ Aritmética de números complexos.▸ Operações gráficas.▸ Video encoding.
2006 - SSE4 com 54 novas instruções anunciadas pela intel.
2007 - 46 instruções adicionadas com SSE5.
2011 - registradores de 256bits e estende SSE - Advanced Vector Extensions (AVX).
2013 - Extensão dos registradores de 256bits para 512bits - Advanced Vector Extensions (AVX2).
Introdução
Era uma vez...
1997 - Arquitetura dos processadores Pentium com tecnologia MMX - Multi Media Extensions.
1999 - Instruções SSE (Streaming SIMD Extensions) - Pentium III - 8 Registradores de 128 bits.
2001 - 144 novas instruções chamadas de SSE2 nos processadores da Intel.
2003 - Endereçamento de 64bits - Processadores da AMD.
▸ Aumento para 16 registradores de 128bits - SSE.
2004 - Intel incorpora o SS3 - 13 novas instruções:
▸ Aritmética de números complexos.▸ Operações gráficas.▸ Video encoding.
2006 - SSE4 com 54 novas instruções anunciadas pela intel.
2007 - 46 instruções adicionadas com SSE5.
2011 - registradores de 256bits e estende SSE - Advanced Vector Extensions (AVX).
2013 - Extensão dos registradores de 256bits para 512bits - Advanced Vector Extensions (AVX2).
Introdução
Era uma vez...
1997 - Arquitetura dos processadores Pentium com tecnologia MMX - Multi Media Extensions.
1999 - Instruções SSE (Streaming SIMD Extensions) - Pentium III - 8 Registradores de 128 bits.
2001 - 144 novas instruções chamadas de SSE2 nos processadores da Intel.
2003 - Endereçamento de 64bits - Processadores da AMD.
▸ Aumento para 16 registradores de 128bits - SSE.
2004 - Intel incorpora o SS3 - 13 novas instruções:
▸ Aritmética de números complexos.▸ Operações gráficas.▸ Video encoding.
2006 - SSE4 com 54 novas instruções anunciadas pela intel.
2007 - 46 instruções adicionadas com SSE5.
2011 - registradores de 256bits e estende SSE - Advanced Vector Extensions (AVX).
2013 - Extensão dos registradores de 256bits para 512bits - Advanced Vector Extensions (AVX2).
Introdução
Era uma vez...
1997 - Arquitetura dos processadores Pentium com tecnologia MMX - Multi Media Extensions.
1999 - Instruções SSE (Streaming SIMD Extensions) - Pentium III - 8 Registradores de 128 bits.
2001 - 144 novas instruções chamadas de SSE2 nos processadores da Intel.
2003 - Endereçamento de 64bits - Processadores da AMD.
▸ Aumento para 16 registradores de 128bits - SSE.
2004 - Intel incorpora o SS3 - 13 novas instruções:
▸ Aritmética de números complexos.▸ Operações gráficas.▸ Video encoding.
2006 - SSE4 com 54 novas instruções anunciadas pela intel.
2007 - 46 instruções adicionadas com SSE5.
2011 - registradores de 256bits e estende SSE - Advanced Vector Extensions (AVX).
2013 - Extensão dos registradores de 256bits para 512bits - Advanced Vector Extensions (AVX2).
Introdução
Era uma vez...
1997 - Arquitetura dos processadores Pentium com tecnologia MMX - Multi Media Extensions.
1999 - Instruções SSE (Streaming SIMD Extensions) - Pentium III - 8 Registradores de 128 bits.
2001 - 144 novas instruções chamadas de SSE2 nos processadores da Intel.
2003 - Endereçamento de 64bits - Processadores da AMD.
▸ Aumento para 16 registradores de 128bits - SSE.
2004 - Intel incorpora o SS3 - 13 novas instruções:
▸ Aritmética de números complexos.▸ Operações gráficas.▸ Video encoding.
2006 - SSE4 com 54 novas instruções anunciadas pela intel.
2007 - 46 instruções adicionadas com SSE5.
2011 - registradores de 256bits e estende SSE - Advanced Vector Extensions (AVX).
2013 - Extensão dos registradores de 256bits para 512bits - Advanced Vector Extensions (AVX2).
Introdução
Era uma vez...
1997 - Arquitetura dos processadores Pentium com tecnologia MMX - Multi Media Extensions.
1999 - Instruções SSE (Streaming SIMD Extensions) - Pentium III - 8 Registradores de 128 bits.
2001 - 144 novas instruções chamadas de SSE2 nos processadores da Intel.
2003 - Endereçamento de 64bits - Processadores da AMD.
▸ Aumento para 16 registradores de 128bits - SSE.
2004 - Intel incorpora o SS3 - 13 novas instruções:
▸ Aritmética de números complexos.▸ Operações gráficas.▸ Video encoding.
2006 - SSE4 com 54 novas instruções anunciadas pela intel.
2007 - 46 instruções adicionadas com SSE5.
2011 - registradores de 256bits e estende SSE - Advanced Vector Extensions (AVX).
2013 - Extensão dos registradores de 256bits para 512bits - Advanced Vector Extensions (AVX2).
Introdução
Era uma vez...
1997 - Arquitetura dos processadores Pentium com tecnologia MMX - Multi Media Extensions.
1999 - Instruções SSE (Streaming SIMD Extensions) - Pentium III - 8 Registradores de 128 bits.
2001 - 144 novas instruções chamadas de SSE2 nos processadores da Intel.
2003 - Endereçamento de 64bits - Processadores da AMD.
▸ Aumento para 16 registradores de 128bits - SSE.
2004 - Intel incorpora o SS3 - 13 novas instruções:
▸ Aritmética de números complexos.▸ Operações gráficas.▸ Video encoding.
2006 - SSE4 com 54 novas instruções anunciadas pela intel.
2007 - 46 instruções adicionadas com SSE5.
2011 - registradores de 256bits e estende SSE - Advanced Vector Extensions (AVX).
2013 - Extensão dos registradores de 256bits para 512bits - Advanced Vector Extensions (AVX2).
Introdução
Era uma vez...
1997 - Arquitetura dos processadores Pentium com tecnologia MMX - Multi Media Extensions.
1999 - Instruções SSE (Streaming SIMD Extensions) - Pentium III - 8 Registradores de 128 bits.
2001 - 144 novas instruções chamadas de SSE2 nos processadores da Intel.
2003 - Endereçamento de 64bits - Processadores da AMD.
▸ Aumento para 16 registradores de 128bits - SSE.
2004 - Intel incorpora o SS3 - 13 novas instruções:
▸ Aritmética de números complexos.▸ Operações gráficas.▸ Video encoding.
2006 - SSE4 com 54 novas instruções anunciadas pela intel.
2007 - 46 instruções adicionadas com SSE5.
2011 - registradores de 256bits e estende SSE - Advanced Vector Extensions (AVX).
2013 - Extensão dos registradores de 256bits para 512bits - Advanced Vector Extensions (AVX2).
Introdução
Era uma vez...
1997 - Arquitetura dos processadores Pentium com tecnologia MMX - Multi Media Extensions.
1999 - Instruções SSE (Streaming SIMD Extensions) - Pentium III - 8 Registradores de 128 bits.
2001 - 144 novas instruções chamadas de SSE2 nos processadores da Intel.
2003 - Endereçamento de 64bits - Processadores da AMD.
▸ Aumento para 16
registradores de 128bits - SSE.
2004 - Intel incorpora o SS3 - 13 novas instruções:
▸ Aritmética de números complexos.▸ Operações gráficas.▸ Video encoding.
2006 - SSE4 com 54 novas instruções anunciadas pela intel.
2007 - 46 instruções adicionadas com SSE5.
2011 - registradores de 256bits e estende SSE - Advanced Vector Extensions (AVX).
2013 - Extensão dos registradores de 256bits para 512bits - Advanced Vector Extensions (AVX2).
Registradores vetoriais
Instruções SSE.
Operação sobre um conjunto de dados (arrays / vetores 1D).
O comprimento do vetor define o tamanho do conjunto de dados.
A instrução é colocada no pipeline.
R1 R2
R3
+
R1 R2
R3
+
R1 R2
R3
+
R1 R2
R3
+
R1 R2
R3
+
R1 R2
R3
+
Comprimento
Registradores vetoriais
Instruções SSE.
Operação sobre um conjunto de dados (arrays / vetores 1D).
O comprimento do vetor define o tamanho do conjunto de dados.
A instrução é colocada no pipeline.
R1 R2
R3
+
R1 R2
R3
+
R1 R2
R3
+
R1 R2
R3
+
R1 R2
R3
+
R1 R2
R3
+
Comprimento
Registradores vetoriais
Instruções SSE.
Operação sobre um conjunto de dados (arrays / vetores 1D).
O comprimento do vetor define o tamanho do conjunto de dados.
A instrução é colocada no pipeline.
R1 R2
R3
+
R1 R2
R3
+
R1 R2
R3
+
R1 R2
R3
+
R1 R2
R3
+
R1 R2
R3
+
Comprimento
Registradores vetoriais
Vantagens:
▸ Instrução com baixa largura de banda.▸ Endereçamento da memória mais simples.▸ Redução de problemas de acesso.▸ São escaláveis.▸ Redução do código.▸ Paralelismo de dados no algoritmo.
Desvantagem:
▸ Modelagem do problema (SIMD).▸ Dependência dos dados.▸ Conhecimento das instruções.▸ Exemplo:
c[i] = a[i] + c[i-1]
Registradores vetoriais
Vantagens:
▸ Instrução com baixa largura de banda.▸ Endereçamento da memória mais simples.▸ Redução de problemas de acesso.▸ São escaláveis.▸ Redução do código.▸ Paralelismo de dados no algoritmo.
Desvantagem:
▸ Modelagem do problema (SIMD).▸ Dependência dos dados.▸ Conhecimento das instruções.▸ Exemplo:
c[i] = a[i] + c[i-1]
Registradores vetoriais
Vantagens:
▸ Instrução com baixa largura de banda.▸ Endereçamento da memória mais simples.▸ Redução de problemas de acesso.▸ São escaláveis.▸ Redução do código.▸ Paralelismo de dados no algoritmo.
Desvantagem:
▸ Modelagem do problema (SIMD).▸ Dependência dos dados.▸ Conhecimento das instruções.▸ Exemplo:
c[i] = a[i] + c[i-1]
Registradores vetoriais
ymm
64bits 64bits
128bits
xmm
32bits32bits32bits32bits
64bits 64bits
32bits32bits32bits32bits
64bits 64bits
32bits32bits32bits32bits
256bits
zmm...
64bits
32bits32bits
64bits 64bits
32bits32bits32bits32bits
64bits 64bits
32bits32bits32bits32bits
...
512bits
Registradores vetoriais
Exemplo (não-vetorial × vetorial):
▸ Problema: Somar dois vetores (posições contíguas).▸ Solução não-vetorial.
M[3] M[2] M[1] M[0]
M[45] M[44] M[43] M[42]
+
}
32 bits
}128 bits
M[45]+M[3]
M[44]+M[2]
M[43]+M[1]
M[42]+M[0]
8 instruções de load.
4 instruções de add.
4 instruções de store.
Total: 16 instruções
Registradores vetoriais
Exemplo (não-vetorial × vetorial):
▸ Problema: Somar dois vetores (posições contíguas).▸ Solução não-vetorial.
M[3] M[2] M[1] M[0]
M[45] M[44] M[43] M[42]
+
}
32 bits
}128 bits
M[45]+M[3]
M[44]+M[2]
M[43]+M[1]
M[42]+M[0]
8 instruções de load.
4 instruções de add.
4 instruções de store.
Total: 16 instruções
Registradores vetoriais
Exemplo (não-vetorial × vetorial):
▸ Problema: Somar dois vetores (posições contíguas).▸ Solução não-vetorial.
M[3] M[2] M[1] M[0]
M[45] M[44] M[43] M[42]
+
}
32 bits
}128 bits
M[45]+M[3]
M[44]+M[2]
M[43]+M[1]
M[42]+M[0]
8 instruções de load.
4 instruções de add.
4 instruções de store.
Total: 16 instruções
Registradores vetoriais
Exemplo (não-vetorial × vetorial):
▸ Problema: Somar dois vetores (posições contíguas).▸ Solução não-vetorial.
M[3] M[2] M[1] M[0]
M[45] M[44] M[43] M[42]
+
}
32 bits
}128 bits
M[45]+M[3]
M[44]+M[2]
M[43]+M[1]
M[42]+M[0]
8 instruções de load.
4 instruções de add.
4 instruções de store.
Total: 16 instruções
Registradores vetoriais
Exemplo (não-vetorial × vetorial):
▸ Problema: Somar dois vetores (posições contíguas).▸ Solução não-vetorial.
M[3] M[2] M[1] M[0]
M[45] M[44] M[43] M[42]
+
}
32 bits
}128 bits
M[45]+M[3]
M[44]+M[2]
M[43]+M[1]
M[42]+M[0]
8 instruções de load.
4 instruções de add.
4 instruções de store.
Total: 16 instruções
Registradores vetoriais
Exemplo (não-vetorial × vetorial):
▸ Problema: Somar dois vetores (posições contíguas).▸ Solução não-vetorial.
M[3] M[2] M[1] M[0]
M[45] M[44] M[43] M[42]
+
}
32 bits
}128 bits
M[45]+M[3]
M[44]+M[2]
M[43]+M[1]
M[42]+M[0]
8 instruções de load.
4 instruções de add.
4 instruções de store.
Total: 16 instruções
Registradores vetoriais
Exemplo (não-vetorial × vetorial):
▸ Problema: Somar dois vetores (posições contíguas).▸ Solução não-vetorial.
M[3] M[2] M[1] M[0]
M[45] M[44] M[43] M[42]
+
}
32 bits
}128 bits
M[45]+M[3]
M[44]+M[2]
M[43]+M[1]
M[42]+M[0]
8 instruções de load.
4 instruções de add.
4 instruções de store.
Total: 16 instruções
Registradores vetoriais
Exemplo (não-vetorial × vetorial):
▸ Problema: Somar dois vetores (posições contíguas).
Qual foi o speedup?
▸ O speedup esperado foi de 4 vezes!
Registradores vetoriais
Exemplo (não-vetorial × vetorial):
▸ Problema: Somar dois vetores (posições contíguas).
Qual foi o speedup?
▸ O speedup esperado foi de 4 vezes!
Registradores vetoriais
Speedup:
▸ Paralelismo verdadeiro SIMD.▸ Poucos ciclos de clock para executar as instruções.▸ Speed-up é proporcional a largura do registrador vetorial empregado:
i 128bits - SSE - 2x precisão dupla e 4x para precisão simples.
ii 256bits - AVX - 4x precisão dupla e 8x para precisão simples.
iii 512bits - MIC - 8x precisão dupla e 16x para precisão simples.▸ Dado o processador i3-3110M CPU com 2.40GHz e considerando os registradores
AVX, tem-se:
Gflops teórico: 2 cores/CPU × 4 doubles × 2.4GHz = 19.2 Gflops/CPU em
precisão dupla.
Observação:
O pipeline pode melhorar a performance!
Registradores vetoriais
Speedup:
▸ Paralelismo verdadeiro SIMD.▸ Poucos ciclos de clock para executar as instruções.▸ Speed-up é proporcional a largura do registrador vetorial empregado:
i 128bits - SSE - 2x precisão dupla e 4x para precisão simples.
ii 256bits - AVX - 4x precisão dupla e 8x para precisão simples.
iii 512bits - MIC - 8x precisão dupla e 16x para precisão simples.▸ Dado o processador i3-3110M CPU com 2.40GHz e considerando os registradores
AVX, tem-se:
Gflops teórico: 2 cores/CPU × 4 doubles × 2.4GHz = 19.2 Gflops/CPU em
precisão dupla.
Observação:
O pipeline pode melhorar a performance!
Registradores vetoriais
Speedup:
▸ Paralelismo verdadeiro SIMD.▸ Poucos ciclos de clock para executar as instruções.▸ Speed-up é proporcional a largura do registrador vetorial empregado:
i 128bits - SSE - 2x precisão dupla e 4x para precisão simples.
ii 256bits - AVX - 4x precisão dupla e 8x para precisão simples.
iii 512bits - MIC - 8x precisão dupla e 16x para precisão simples.▸ Dado o processador i3-3110M CPU com 2.40GHz e considerando os registradores
AVX, tem-se:
Gflops teórico: 2 cores/CPU × 4 doubles × 2.4GHz = 19.2 Gflops/CPU em
precisão dupla.
Observação:
O pipeline pode melhorar a performance!
Registradores vetoriais
Speedup:
▸ Paralelismo verdadeiro SIMD.▸ Poucos ciclos de clock para executar as instruções.▸ Speed-up é proporcional a largura do registrador vetorial empregado:
i 128bits
- SSE - 2x precisão dupla e 4x para precisão simples.
ii 256bits - AVX - 4x precisão dupla e 8x para precisão simples.
iii 512bits - MIC - 8x precisão dupla e 16x para precisão simples.▸ Dado o processador i3-3110M CPU com 2.40GHz e considerando os registradores
AVX, tem-se:
Gflops teórico: 2 cores/CPU × 4 doubles × 2.4GHz = 19.2 Gflops/CPU em
precisão dupla.
Observação:
O pipeline pode melhorar a performance!
Programando registradores vetoriais
Programando registradores vetoriais
i Como podemos utilizar este recurso da máquina ?
a Programar diretamente no assembly/
b Permitir o compilador decidir quando e como usar as instruções. ,
c Utilizar instruções SSE de forma explícita.
Programando registradores vetoriais
i Como podemos utilizar este recurso da máquina ?
a Programar diretamente no assembly
/
b Permitir o compilador decidir quando e como usar as instruções. ,
c Utilizar instruções SSE de forma explícita.
Programando registradores vetoriais
i Como podemos utilizar este recurso da máquina ?
a Programar diretamente no assembly/
b Permitir o compilador decidir quando e como usar as instruções.
,
c Utilizar instruções SSE de forma explícita.
Programando registradores vetoriais
i Como podemos utilizar este recurso da máquina ?
a Programar diretamente no assembly/
b Permitir o compilador decidir quando e como usar as instruções. ,
c Utilizar instruções SSE de forma explícita.
Programando registradores vetoriais
i Como podemos utilizar este recurso da máquina ?
a Programar diretamente no assembly/
b Permitir o compilador decidir quando e como usar as instruções. ,
c Utilizar instruções SSE de forma explícita.
ii Onde utilizar os registradores vetoriais ?
▸ Em laços que conhecemos suas restrições.
iii Conhecer o padrão de acesso a memória (alinhamento de 16 bytes).
Programando registradores vetoriais
i Como podemos utilizar este recurso da máquina ?
a Programar diretamente no assembly
/
b Permitir o compilador decidir quando e como usar as instruções. ,
c Utilizar instruções SSE de forma explícita.
ii Onde utilizar os registradores vetoriais ?
▸ Em laços que conhecemos suas restrições.
iii Conhecer o padrão de acesso a memória (alinhamento de 16 bytes).
Programando registradores vetoriais
i Como podemos utilizar este recurso da máquina ?
a Programar diretamente no assembly/
b Permitir o compilador decidir quando e como usar as instruções.
,
c Utilizar instruções SSE de forma explícita.
ii Onde utilizar os registradores vetoriais ?
▸ Em laços que conhecemos suas restrições.
iii Conhecer o padrão de acesso a memória (alinhamento de 16 bytes).
Programando registradores vetoriais
i Como podemos utilizar este recurso da máquina ?
a Programar diretamente no assembly/
b Permitir o compilador decidir quando e como usar as instruções. ,
c Utilizar instruções SSE de forma explícita.
ii Onde utilizar os registradores vetoriais ?
▸ Em laços que conhecemos suas restrições.
iii Conhecer o padrão de acesso a memória (alinhamento de 16 bytes).
Programando registradores vetoriais
i Como podemos utilizar este recurso da máquina ?
a Programar diretamente no assembly/
b Permitir o compilador decidir quando e como usar as instruções. ,
c Utilizar instruções SSE de forma explícita.
ii Onde utilizar os registradores vetoriais ?
▸ Em laços que conhecemos suas restrições.
iii Conhecer o padrão de acesso a memória (alinhamento de 16 bytes).
Programando registradores vetoriais
Como saber se o processador tem suporte a instrução SSE?
cat /proc/cpuinfo | less
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca
cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx
pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl
xtopology nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 monitor
ds_cpl vmx est tm2 ssse3 fma cx16 xtpr pdcm pcid sse4_1 sse4_2 movbe
popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm ida arat
epb pln pts dtherm tpr_shadow vnmi flexpriority ept vpid fsgsbase
tsc_adjust bmi1 avx2 smep bmi2 erms invpcid xsaveopt bugs
Programando registradores vetoriais
Como saber se o processador tem suporte a instrução SSE?
cat /proc/cpuinfo | less
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca
cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx
pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl
xtopology nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 monitor
ds_cpl vmx est tm2 ssse3 fma cx16 xtpr pdcm pcid sse4_1 sse4_2 movbe
popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm ida arat
epb pln pts dtherm tpr_shadow vnmi flexpriority ept vpid fsgsbase
tsc_adjust bmi1 avx2 smep bmi2 erms invpcid xsaveopt bugs
Programando registradores vetoriais
Como saber se o processador tem suporte a instrução SSE?
cat /proc/cpuinfo | less
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca
cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx
pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl
xtopology nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 monitor
ds_cpl vmx est tm2 ssse3 fma cx16 xtpr pdcm pcid sse4_1 sse4_2 movbe
popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm ida arat
epb pln pts dtherm tpr_shadow vnmi flexpriority ept vpid fsgsbase
tsc_adjust bmi1 avx2 smep bmi2 erms invpcid xsaveopt bugs
Programando registradores vetoriais
Requisitos básicos para a vetorizar laços:
i Conhecimento do número de voltas do laço.
ii Se desvios de fluxo de código.
iii Sem chamadas de função, apenas as funções matemáticas: pow, sqrt, sin, etc...
Programando registradores vetoriais
Como podemos desenrolar o laço do código abaixo a fim de utilizar a
vetorização ?
1 for (int i = 0; i < N; i++) {
2 a[i] = b[i] + c[i];
3 }
1 for (int i = 0; i < N; i+= 4) {
2 a[i + 0] = b[i + 0] + c[i + 0];
3 a[i + 1] = b[i + 1] + c[i + 1];
4 a[i + 2] = b[i + 2] + c[i + 2];
5 a[i + 3] = b[i + 3] + c[i + 3];
6 }
Load b(i..i+3)
Load c(i..i+3)
Operate b+c->a
Store a
Programando registradores vetoriais
Como podemos desenrolar o laço do código abaixo a fim de utilizar a
vetorização ?
1 for (int i = 0; i < N; i++) {
2 a[i] = b[i] + c[i];
3 }
1 for (int i = 0; i < N; i+= 4) {
2 a[i + 0] = b[i + 0] + c[i + 0];
3 a[i + 1] = b[i + 1] + c[i + 1];
4 a[i + 2] = b[i + 2] + c[i + 2];
5 a[i + 3] = b[i + 3] + c[i + 3];
6 }
Load b(i..i+3)
Load c(i..i+3)
Operate b+c->a
Store a
Programando registradores vetoriais
gcc / g++:
▸ Uso dos registradores vetoriais está desabilitado por padrão.▸ Habilitado nas otimizações ≥ -O2.
Utilizando de forma explícita:▸ Uso de includes:
a #include <xmmintrin.h>: Instruções SSE (128 bits).
b #include <immintrin.h>: Instruções AVX (256 bits).
Programando registradores vetoriais
Exemplo de código de 128 bits:
▸ Entrada da função são dois vetores de tamanho size (vetor a e a).▸ Saída é escrita no vetor a.▸ Precisão simples e instruções de 128bits (registradores xmm).▸ Código executa: ai =√bi
1 void sqrt_mmx_s(float * __restrict__ a,
2 float * __restrict__ b,
3 int size){
4 for (int i = 0; i < size; i += 4){
5 __m128 vec = _mm_load_ps(b + i);
6 __m128 sqrt = _mm_sqrt_ps(vec);
7 _mm_store_ps(a + i, sqrt);
8 }
9 }
Programando registradores vetoriais
Exemplo de código de 256 bits:
▸ Entrada da função são dois vetores de tamanho size (vetor a e a).▸ Saída é escrita no vetor a.▸ Precisão simples e instruções de 256bits (registradores ymm).▸ Código executa: ai =√bi
1 void sqrt_avx_s(float * __restrict__ a,
2 float * __restrict__ b,
3 int size){
4 for (int i = 0; i < size; i += 8){
5 __m256 vec = _mm256_load_ps(b + i);
6 __m256 sqrt = _mm256_sqrt_ps(vec);
7 _mm256_store_ps(a + i, sqrt);
8 }
9 }
	Introdução
	Registradores vetoriais
	Programando registradores vetoriais

Teste o Premium para desbloquear

Aproveite todos os benefícios por 3 dias sem pagar! 😉
Já tem cadastro?

Continue navegando