Baixe o app para aproveitar ainda mais
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
Compartilhar