Sunteți pe pagina 1din 8

Uma Anlise de Vetorizao Automtica do Compilador GCC

Jaguaraci Batista Silva Instituto de Cincia e Tecnologia, Universidade Federal de So Paulo Campus So Jos dos Campos, So Paulo-SP jaguaracisilva@gmail.com

Resumo: Existem trs formas principais de se fazer uso de unidades de vetorizao


nos processadores atuais: (i) pela programao em cdigo de montagem, (ii) atravs da programao de funes intrnsecas em linguagens de alto nvel ou (iii) usar um compilador que traduz automaticamente as operaes escalares em vetoriais. Seja atravs da programao em linguagem de montagem ou usando funes intrnsecas, o programador deve possuir o controle completo dos detalhes da sua implementao, que geralmente especfica para uma arquitetura. Por isso a perseguio da alta performance, nestes casos, pode incorrer em baixa produtividade e portabilidade do cdigo. Esta trabalho apresenta uma anlise de vetorizao automtica usando o compilador GCC, com o objetivo de analisar quais cdigos de programas em C/C++ podem ser vetorizados automaticamente e quais necessitam de esforos para adicionar instrues intrsecas no cdigo para alcanar os benefcios da vetorizao.

Palavras-chaves: Performance, Algoritmo, Vetorizao, GCC, SSE.

1 - Introduo
Em muitas aplicaes possvel encontrar trechos simples de cdigos envoltos por loops onde a mesma operao executada atravs de vetores de diferentes tipos de elementos. A vetorizao transforma estes laos em instrues que trabalham em vrios itens de dados simultaneamente. Tipicamente, a vetorizao atinge tanto os processadores como suas extenses de vetorizao, cujo os processadores vetoriais foram os principais componentes dos supercomputadores da dcada de 1980 e incio de 1990. As extenses de vetorizao para microprocessadores de uso geral como Intel MMX e AltiVec IBM, surgiu na dcada de 1990 para suporte a aplicaes multimdia e a tecnologia pode ser encontrada hoje facilmente, em consoles de videogame e placas grficas. Hoje, as extenses de vetorizao no so utilizadas apenas para os aplicativos multimdia e jogos de vdeo, mas tambm para computao cientfica [1]. O speedup mximo que pode ser obtido por meio de extenses de vetorizao dos processadores pode ser dado em funo da largura dos seus registros e unidades de vetorizao. A maioria das mquinas hoje possuem unidades de vetorizao de 128 bits e as operaes de vetorizao em relao as sequenciais podem ser equivalentes at 2, 4, 8 at 16 vezes mais rpida que a sua congnere escalar, dependendo do tipo

de dados. Assim, vetorizao uma das transformaes do compilador que pode ter um impacto significativo no desempenho das aplicaes [1]. Existem trs formas principais de se fazer uso de unidades de vetorizao: (i) pela programao em cdigo de montagem, (ii) atravs da programao com funes intrnsecas em linguagens de alto nvel (e.g. C) ou (iii) usar um compilador que traduz automaticamente as operaes escalares em vetoriais. Seja atravs da programao em linguagem de montagem ou usando funes intrnsecas, o programador quem deve possuir o controle completo dos detalhes da sua implementao, que geralmente especfica para uma arquitetura. Por isso a perseguio da alta performance, nestes casos, pode inferir em baixa produtividade e portabilidade do cdigo. Por outro lado, existem compiladores tais como GCC e ICC da Intel (ICC) que podem gerar automaticamente o cdigo vetorizado [1]. Este artigo apresenta uma anlise do compilador GCC sobre quais laos de um conjunto de testes podem ser automaticamente vetorizveis, quais deles no foi possvel a vetorizao e quais modificaes foram necessrias para adicionar instrues intrsecas de vetorizao usando a extenso SSE3 (processadores Intel) atravs da linguagem C. Aps, foram realizadas medies de desempenho com todas as verses dos cdigos para medir: o tempo de execuo, MFLOPS e CPE (Ciclos por elementos do vetor). O estudo realizou ainda uma segunda anlise em uma pequena aplicao que implementa o mtodo dos mnimos quadrados, contruindo uma verso com e sem vetorizao, analisando a vetorizao automtica dos compiladores e adicionando funes intrinsecas para as extenses de vetorizao do processador. A anlise tambm verificou o desempenho de todas as verses dos algoritmos utilizando mtricas de tempo de execuo, MFLOPS e CPE.

2 Anlise da Vetorizao de Cdigo Usando o Compilador GCC


O experimento foi iniciado pela definio de duas etapas de anlise: 1-clculo de vetores e 2-construo de uma aplicao, que obtm a partir de um arquivo, os dados para o realizar o clculo de mnimos quadrados. Essa ltima abordagem serve apenas para ilustrar como seria uma modificao de cdigo em um sistema legado para alcanar os benefcios da vetorizao. 2.1 Clculo de Vetores O clculo de vetores tem o objetivo de analisar quais implementaes de cdigo podem ser automaticamente vetorizadas e por outro lado, as que no possam ser, indicar um modo de como podem ser modificadas para obterem o benefcio da vetorizao. Neste estudo foram construdos 6 algortmos, cujo cdigo de implementao utiliza a linguagem C:

A
for(i=1;i<n; i++) { x[i]=a[i]+b[i]; r[i]=x[i-1]+1.0; }

B
for(i=0;i<n;i++) { x[i]=a[i]+b[i]; r[i]=x[i+1]+1.0; }

C
for(i=0;i<n;i++) { x[i]=a[i]+b[i]; a[i]=x[i+1]+1.0; }

D
for(i=0;i<n;i++) { t=a[i]+b[i]; r[i]=t+1.0/t; }

E
for (i=0; i<n; i++) { s += a[i]; }

F
for (i=1; i<n; i++) { a[i] = a[i-1] + b[i]; }

Tabela 1 Algoritmos Implementados para Teste de Vetorizao Automtica.

Conforme a Tabela 1, possvel ver simultaneamente todos os algoritmos implementados, onde a diferena entre eles est na operao de clculo dos vetores. A partir destas implementaes, utilizou-se 3 modos de anlise: (i) uma compilao do cdigo serial na sua forma original, (ii) compilao para possibilitar a vetorizao automtica utilizando extenses SSE3 do processador e (iii) modificao do cdigo para possibilitar a vetorizao intrsica.
B for (i=0; i<n-1; i++) { temp[i] = a[i] + b[i]; } for (i=0; i<n-1; i++) { r[i] = x[i+1] + 1.0; } for (i=0; i<n-1; i++) { temp2[i] = r[i+1] + temp[i]; } for (i=0; i<n-1; i++) { r[i] = temp2[i]; } C for (i=0; i<n-1; i++) { temp[i] = a[i] + b[i]; } for (i=0; i<n-1; i++) { a[i] = x[i+1] + 1.0; } for (i=0; i<n-1; i++) { a[i] = temp[i]; } F for (i=1; i<n; i++) { temp[i] = a[i-1] + b[i]; } for (i=1; i<n; i++) { a[i] = temp[i]; }

Tabela 2 Algoritmos Modificados Para Suportar a Vetorizao Automtica.

A primeira tentativa de vetorizao automtica s foi possvel com os algoritmos A e D, sendo que o algorimo E foi necessrio acrescentar a opo -funsafe-mathoptimizations do GCC, para que fosse possvel vetoriz-lo automaticamente. Por questo de dependncia de dados, os outros algoritmos (Tabela 2) tiveram de ser modificados, onde a estratgia de vetorizao nesses casos foi baseada em [2].
B long int i, nvecsse; __m128 v1, v2; nvecsse = n - (n%4); for(i=0; i<n; i+=4) { v1 = _mm_load_ps(a+i); v2 = _mm_load_ps(b+i); v2 = _mm_add_ps(v1, v2); _mm_store_ps(x+i, v2); } C long int i, nvecsse; __m128 v1, v2; nvecsse = n - (n%4); for(i=0; i<n; i+=4) { v1 = _mm_load_ps(a+i); v2 = _mm_load_ps(b+i); v2 = _mm_add_ps(v1, v2); _mm_store_ps(x+i, v2); } F long int i, nvecsse; __m128 v1, v2, v3; nvecsse = n - (n%4); for(i=0; i<n; i+=4) { v1 = _mm_load_ps(a+i); v2 = _mm_load_ps(b+i); v2 = _mm_add_ps(v1, v2); _mm_store_ps(x+i, v2); }

for (i=nvecsse; i<n; i++) { r[i] = x[i] + 1.0; }

for (i=nvecsse; i<n; i++) { a[i] = x[i+1] + 1.0; }

for (i=nvecsse; i<n; i++) { a[i] = x[i-1] + b[i]; }

Tabela 3 Algoritmos Modificados Para Vetorizao Intrsica do Trecho no Vetorizado.

A segunda tentativa de vetorizao utilizou a tcnica de vetorizao intrsica de cdigo, o que sugere criao de variveis com acesso as extenes dos registradores diretamente. Dessa forma, possvel forar a vetorizao dos trechos de cdigo que no puderam ser automaticamente vetorizveis anteriormente (Tabela 1). O objetivo desta modificao foi perceber se haveria influncia na performance do trecho no vetorizvel do algoritmo passando por duas etapas de modificao (Tabela 2 e 3), o que pode ser visto na seo de resultados (Figura 1). 2.2 Clculo dos Mnimos Quadrados A segunda parte do estudo exibe de forma pragmtica como obter o benefcio da vetorizao em um sistema legado, neste caso foi selecionado um trecho de uma aplicao industrial que obtm os dados de um arquivo (primeira linha: quantidade de elementos e demais linhas os elementos x e y) para leitura e clculo da funo usando mnimos quadrados. O mtodo dos mnimos quadrados consiste em um estimador que
minimiza a soma dos quadrados dos resduos de uma regresso linear, de forma a maximizar o grau de ajuste do modelo aos dados observados, procurando encontrar o melhor ajuste para um conjunto de dados tentando minimizar a soma dos quadrados das diferenas entre o valor estimado e os dados observados, onde tais diferenas so chamadas resduos [3]. Programa Serial for (i=0; i<n; i++) { if (fscanf(infile, "%lf %lf", &x[i], &y[i])!=-1) printf("error reading line\n"); SUMx = SUMx + x[i]; SUMy = SUMy + y[i]; SUMxy = SUMxy + x[i]*y[i]; SUMxx = SUMxx + x[i]*x[i]; } for (i=0; i<n; i++) { y_estimate = slope*x[i] + y_intercept; res = y[i] - y_estimate; SUMres = SUMres + res*res; printf (" (%6.2lf %6.2lf) %6.2lf %6.2lf\n", Modificado Para Vetorizao Automtica for (i=0; i<n; i++) { if (fscanf(infile, "%lf %lf", &x[i], &y[i])!=-1) printf("error reading line\n"); } for (i=0; i<n; i++) { tempSUMx[i] += x[i]; tempSUMy[i] += y[i]; tempSUMxy[i] += x[i]*y[i]; tempx[i] = x[i]; tempSUMxx[i] += x[i]*tempx[i]; } for (i=0; i<n; i++) { SUMx += tempSUMx[i]; SUMy += tempSUMy[i]; SUMxy += Modificado para Vetorizao Intrsica __m128 xR, yR, xtR, s1, s2, s3, s4; for (i=0; i<n; i+=4) { xR = _mm_load_ps(&x[i]); s1= mm_load_ps(&tempSUMx[i]); s2 = _mm_add_ps(xR, s1); _mm_store_ps(&tempSUMx[i], s2); yR = _mm_load_ps(&y[i]); s1 =_mm_load_ps(&tempSUMy[i]); s2 = _mm_add_ps(yR, s1); _mm_store_ps(&tempSUMy[i], s2); s1 = _mm_mul_ps(xR, yR); s2=_mm_load_ps(&tempSUMxy[i]); s3 = _mm_add_ps(s1, s2); _mm_store_ps(&tempSUMxy[i], s3); xtR = _mm_load_ps(&x[i]); s1 = _mm_mul_ps(xR, xtR);

x[i], y[i], y_estimate, res); }

tempSUMxy[i]; SUMxx += tempSUMxx[i]; }

s2=_mm_load_ps(&tempSUMxx[i]); s3 = _mm_add_ps(s1, s2); _mm_store_ps(&tempSUMxx[i], s3); }

Tabela 4 Algoritmos implementados para o Clculo dos Mnimos Quadrados.

O primeira programa foi implementado de forma serial (Tabela 4 - Coluna 1), onde possvel observar que a leitura dos dados, o clculo da funo e a sada do programa foram dividos em dois loops. O primeiro obtm os dados de entrada e realiza o clculo, neste caso, o primeiro lao proibitivo para vetorizao automtica, porque h existncia de dependncia de dados (Linha 11 - x[i]*x[i]). O segundo loop realiza a segunda parte do clculo e gera a sada da funo com os resultados. Para efeito de anlise, o estudo apenas realizou modificaes no primeiro loop, tambm para que o exemplo se torna-se de fcil entendimento e didtico. Apenas a parte em negrito do cdigo foi modificado para a vetorizao automtica (Tabela 4 Coluna 2), cujo trecho de cdigo utilizou a expanso das variveis para vetores temporrios, e aps o clculo, a reduo dos vetores para as mesmas variveis escalares [2], por isso no foi preciso modificar o trecho de sada do programa. Aps a vetorizao automtica do cdigo, houve uma segunda modificao para vetorizao intrsica do trecho em negrito do programa (Tabela 4 Coluna 3) para analisar se haveria mais algum ganho de performance em relao a vetorizao automtica feita pelo compilador, cujo os resultados esto na prxima seo (Figura 2).

3 Resultados
O estudo utilizou um notebook de 32 bits, com processador Intel Core2 Duo Processor T5550 (2048KB L2 Cache, 1.83 GHz, 667 MHz FSB) e memria de 3GB (667 MHz DDR2), sistema operacional Microsoft Windows Vista Business (Verso 6.0, Compilao 6002, Service Pack 2) o ambiente de desenvolvimento Eclipse 3.5.1 (Build 20090920-1017), com o CDT Development Kit para C/C++, MingW32 e a bilbioteca PAPI 5.0.0, alm da linguagem de programao C, com o GCC verso 4.6.2 no Linux Ubuntu 12.4.1 embarcado em um pendrive via porta USB como ambiente de experimentao, com a finalidade exclusiva de execuo do programa construdo nesse trabalho (Seo de soluo) para coleta das mtricas, atravs das classes instrumentadas com a biblioteca PAPI: Tempo de Execuo, CPE e MFLOPS.

Figura 1 Anlise de Vetorizao com GCC para Clculo de Vetores.

O nmero de linhas utilizado para o clculo de vetorizao foi 40.000.000 e conforme a Figura 1 possvel constatar que em relao a implementao serial (compilada com otimizao O2), a vetorizao automtica usando a extenso SSE3 e a modificao de cdigo para vetorizao intrsica, est ltima prevaleceu com o menor tempo de execuo nos testes: A, B, C e F. Tambm a quantidade de MFLOPS e CPE (quantidade de ciclo de instrues por elementos do vetor) possuem diversas informaes a serem destacadas. O primeiro grfico (Figura 1 - Esquerda Superior) exibe o tempo de soluo dos algoritmos implementados que foram automaticamente vetorizados. Comparando-os diretamente com as opes de compilao do GCC para serial (gcc -O2 -I /papi/include vetorizacao.c -o vetorizacao -L /papi/lib -lpapi) e vetorizao automtica (gcc -O2 msse3 -ftree-vectorize -ftree-vectorizer-verbose=2 -funsafe-math-optimizations -I /papi/include vetorizacao_modificado.c -o vetorizacao_modificado -L /papi/lib -lpapi) possvel ver no grfico que o tempo de soluo com o uso da vetorizao automtica para os casos onde houve dependncia de fluxo de dados, poderia ter um desempenho melhor, caso fossem implementados de forma intrsica [2]. O segundo grfico (Figura 1 - Direita Superior) demonstra a anlise de MFLOPS e as implementaes A, C e E tiveram quase o mesma quantidade de instrues, a implementao E se destaca por ter um maior nmero de instrues, pois apesar do cdigo parecer mais simples, aps compilado para linguagem de mquina, requer um maior controle de atribuies, clculo e armazenamento entre memria principal, cache e registro, o que poderia ser contornado com a criao de uma estratgia

ntrisica de acesso a varivel no registro para evitar a criao e controle de variveis acessando reas no contiguas nas memrias principal e cache. No terceiro grfico (Figura 1 - Esquerda Inferior) apresentado os valores de CPE, onde a vetorizao automtica obteve maior desempenho nos algoritmos seriais, com excesso do algoritmo A. A vetorizao automtica piorou o desempenho dos algoritmos B, C e F, os quais necessitaram ser modificados para vetorizao intrsica (grfico direita inferior), para que as modificaes tivessem um melhor desempenho (Figura 1 Direita Inferior).

Figura 2 Anlise de Vetorizao com GCC para o Clculo de Mnimos Quadrados.

De acordo com a Figura 2 , nota-se qua a vetorizao melhorou o desempenho da funo de clculo de mnimos quadrado, pois o tempo de soluo, a quantidade de MFLOPs e CPE foram reduzidos logo que o algoritmo foi modificado usando a vetorizao automtica do GCC, entretanto o cdigo no foi vetorizado automticamente, incorrendo em modificaes no primeiro lao para que o benefcio fosse alcanado. Consequentemente, a vetorizao intrsica melhorou ainda mais o seu desempenho, a eficincia em relao ao CPE foi 2x melhor que a aplicao serial, MFLOPS 3,7x e o speedup foi superior 2,6x em relao a implementao original.

4 - Concluso
Este trabalho apresentou uma anlise de vetorizao automtica usando o compilador GCC, com o objetivo de analisar quais cdigos de programas em C/C++ podem ser vetorizados automaticamente e quais necessitam de esforos adicionais para alcanar os benefcios da vetorizao. O estudo foi implementado em duas partes: (i)

implementao de algoritmos para clculo de vetores e (ii) implementao de parte de um sistema legado que utiliza a funo de mnimo quadrados. Foi possvel perceber no estudo que por causa da dependncia de fluxo de dados nem sempre pode-se alcanar um melhor desempenho automaticamente e atravs da vetorizao intrsica, utilizando as extenses SSE3, o programa de mnimos quadrados obteve um speedup 2,6x em relao a verso serial. Entretanto nem todos os casos foi possvel detectar uma melhoria no desempenho atravs de vetorizao automtica ou intrsica, o que pode significar uma necessidade de melhorias em outras partes do cdigo serial ou carncia de outras formas de otimizao do GCC. Por isso este estudo sugere que em trabalhos futuros seja feita uma anlise para averiguar outras opes de compilao do GCC e a repetio desse experimento usando outros compiladores, a exemplo do ICC da INTEL, com o objetivo de analisar se os resultados poder-se-iam repetir em outras arquiteturas e compiladores.

Referncias
[1] Maleki, Seeed, Gao, Yaoqing, Garzaran, M. J., Wong, T., Padua, D. A.. (2011) An Evaluation of Vectorizing Compilers. International Conference on Parallel Architectures and Compilation Techniques (PACT 2011). [2] INTEL.. (2012) A Guide to Vectorization with Intel C++ Compilers. [3] Wikipedia..(2012) Mtodo dos Mnimos Quadrados. http://pt.wikipedia.org/wiki/M%C3%A9todo_dos_m%C3%ADnimos_quadrados, acessado em 23 de outubro de 2012.

S-ar putea să vă placă și