Baixe o app para aproveitar ainda mais
Prévia do material em texto
PDF gerado usando o pacote de ferramentas em código aberto mwlib. Veja http://code.pediapress.com/ para mais informações. PDF generated at: Thu, 07 Aug 2014 20:40:02 UTC Programação Paralela em Arquiteturas Multi-Core Conteúdo Páginas Capa 1 Arquitetura Cell Broadband Engine 1 Arquitetura Intel Core e Core 2 7 Arquitetura Sun Niagara e Niagara II 16 Programação em Pthreads 24 Programação em OpenMP 41 Compiladores paralelizadores 50 Ambientes de programação e bibliotecas 66 Aplicações Internet 75 Referências Fontes e Editores da Página 90 Fontes, Licenças e Editores da Imagem 91 Licenças das páginas Licença 92 Capa 1 Capa Programação Paralela em Arquiteturas Multi-Core Índice >> Arquitetura Cell Broadband Engine Este capítulo está estruturado da seguinte forma: primeiramente uma visão geral da arquitetura, para situar o leitor, seguido de um detalhamento da arquitetura e de seus componentes (PPE, SPE, EIB e FlexIO). Após segue uma seção sobre desenvolvimento para Cell, mostrando o modelo de programação e as ferramentas existentes. Finalmente segue uma listagem de aplicações e implementações existentes e uma discussão sobre o futuro da arquitetura. Ao final está uma listagem das referências. Visão geral A arquitetura Cell foi criada em conjunto pela Sony, Toshiba e IBM. O Cell combina um processador PowerPC com coprocessadores com recursos multimídia e processamento vetorial. O Cell é conhecido por ser o processador do PlayStation 3, uma entre as muitas aplicações desse processador. Ele possui grosso modo quatro partes. Estrutura externa de entrada e saída (FlexIO), o processador principal (Power Processing Element - PPE), 8 coprocessadores (Synergistic Processing Elements - SPE) e um barramento circular de dados de alta banda que une as 3 partes (Element Interconnect Bus - EIB). Entre as principais características estão: •• 64 bits. •• Não permite execução de instruções out-of-order. •• É capaz de despachar até duas instruções por ciclo. •• Composto por uma cache L2 de 512KiB, um cache L1 two-way de 32KiB de instruções e um cache four-way set-associative de dados. Arquitetura Cell Broadband Engine 2 Arquitetura O chip do processador Cell pode ser organizado em várias configurações diferentes. A mais comum é a utilização de uma unidade PPE, o Power Processor Element, e múltiplas SPEs, os Synergistic Processing Elements. A PPE e as SPEs são ligadas por um barramento interno de alta velocidade, o EIB (Element Interconnect Bus). Ficando dessa forma: •• 1 Power Processor Element (PPE) •• 8 Synergistic Processor Elements (SPEs) •• Element Interconnect Bus (EIB) •• Direct Memory Access Controller (DMAC) •• 2 Rambus XDR memory controllers •• Interface Rambus FlexIO (Input / Output) PPE O PPE é uma unidade baseada na arquitetura POWER, que é a base das linhas POWER e PowerPc. O papel do PPE é servir como um controlador das várias SPEs, que serão responsáveis pela execução da maior parte da carga de trabalho. Como o PPE é muito similar a outros processadores PowerPc de 64 bits, será possível utilizá-lo com sistemas operacionais convencionais, já disponíveis para esta arquitetura. SPE É um processador totalmente autônomo, capaz de suportar unicamente instruções SIMD. Tem um banco de registradores único. Baseado em arquitetura RISC, com registradores de 128 bits, capazes de guardar qualquer tipo de dados. FlexIO As sete vias de transmissão e cinco de recebimento Rambus FlexIO tem a largura de um byte. Essas vias podem ser configuradas como duas interfaces lógicas. Com as vias Rambus FlexIO, operando a 5Ghz, as interfaces de I/O (Input/Output) atingem um pico de taxa de transferência de 30GB/s de saída e 25GB/s de entrada. Uma configuração típica pode ter uma interface de I/O configurada com taxas de transferência de 30GB/s para saída e 20GB/s para entrada, e outra interface com 5GB/s para saída e 5GB/s para entrada. Dados e comandos na interface de I/O são transmitidos como pacotes. Além do comando, resposta e dado, cada pacote pode carregar informação como tag de dado, tamanho do dado, identificador de comando e informações para controle de fluxo, assim como outras informações. Por causa destes overheads e tempos de chegada de dados e comandos potencialmente não ótimos, a taxa de transferência efetiva nas duas interfaces pode ser menor, variando entre 50% a 80% da taxa bruta. Claro que outros fatores como tráfego de dados no EIB, alocação de recursos, velocidade dos dispositivos de I/O, características de ordenação do tráfego de dados de I/O e interrupções podem, potencialmente, reduzir a taxa de transferência mais ainda. Arquitetura Cell Broadband Engine 3 Desenvolvimento Algumas das principais características do desenvolvimento para Cell: •• Desenvolvimento em cima do Linux para PowerPC. •• Programação para as SPEs é baseada em C, com suporte parcial a C++ (Fortran sendo estudada). •• É responsabilidade do programador fazer o trabalho de consistência entre memória principal e LocalStore nas SPEs. A pesquisa de ferramentas e frameworks para Cell busca prover uma camada de abstração acima do hardware, que permita que as aplicações sejam escaláveis na presença de outros processadores. Este processo demanda novas ferramentas, já que o paradigma de programação para o Cell envolve programas para cada um dos SPEs, que contém todas as suas instruções e seus dados. Este paradigma é diferente do utilizado por linguagens orientadas a objeto, como Java. Essas e outras peculiaridades fazem a programação em Cell ser razoavelmente diferente e mais complicada, o que limita muito o número de desenvolvedores preparados. Modelo de programação Como o modelo de programação do Cell é muito complexo e amplo, seguem alguns documentos que tratam dele com mais detalhes: • A página 4 desse artigo fala sobre a anatomia de uma aplicação Cell. [1] • Arquivo explicando a arquitetura cell, e o modelo de programação.[2] • Descreve modelos de programação, técnicas e indica bibliotecas para facilitarem o desenvolvimento de aplicações.[3] • Tutorial bastante abrangente sobre programação no Cell.[4] Ferramentas: SDKs, Compiladores e Bibliotecas • Cell SDK. [5] • libspe2 - Biblioteca que simplifica a programação, abstraindo o modelo e permitindo programar de forma parecida com outras plataformas. Explicação passo a passo de como cross-compilar usando Linux [6]. •• GDB - Ferramenta de depuração. • Existem projetos chamados Single Source Compilers que seriam capazes de gerar código de máquina tanto para o PPE quanto para os SPEs. [7] • Octopiler - Projeto da IBM para facilitar a programação separando automaticamente um programa entre os várias cores. [8] Aplicações e implementações As principais aplicações do Cell são para multimídia e aplicações científicas. Atualmente ele está sendo implementado em: •• PlayStation 3, um console de vídeo game produzido pela SONY. • Computação científica, através da integração de vários PlayStation 3 em cluster São previstas as seguintes implementações: •• Cinema em casa, a Toshiba anunciou que está considerando produzir televisões de alta definição usando o Cell. A empresa já apresentou um sistema que pode decodificar até 48 fluxos de vídeo MPEG-2 em telas de 1920x1080. • Supercomputadores, o novo supercomputador sendo planejado pela IBM, o IBM Roadrunner, será um híbrido de um CISC de propósito geral e processadores Cell. Foi anunciado que provavelmente este será o primeiro supercomputador capaz de trabalhar na escala dos petaflops. Ele usará uma versão mais atualizada do Cell, feita Arquitetura Cell Broadband Engine 4 com tecnologia de 65nm e SPUs (Synergistic Processing Unit) capazes de executar cálculos de dupla precisão em registradores de 128 bits, alcançando 100 gigaflops de precisão dupla. Futuro A IBM já anunciou que pretende diminuir o tamanho dos transistores do Cell abaixode 90 nm (tecnologia atual) para poder aumentar o clock sem gerar problemas térmicos e diminuir o consumo de energia. Já estão sendo criados e produzidos os primeiros Cells de 65 nm, que reduzem o tamanho do chip de 230 mm² para 120 mm², diminuindo muito os gastos com a produção e permitindo um clock de 6 GHz a 1.3 V, permitindo uma performance de 384 GLFOPS, bem maior que os 204.8 GFLOPS do Cell de 90 nm. Embora ainda não tenha sido mostrada nenhuma tecnologia para diminuir o tamanho além dos 65 nm, é possível que isso ocorra caso o Cell tenha muito sucesso, pois a aliança Sony, Toshiba e IBM anunciou que pretende chegar aos 45 nm e aos 32 nm (apesar de não ter mencionado que será com o Cell). Referências • Pequena descrição sobre a arquitetura. Uma interessante introdução ao tema [9]. • Texto explicativo, com todos os detalhes da arquitetura [10]. • Apresenta por alto o funcionamento, o sistema de memória e cache e os componentes do processador [11]. • Explica bem o funcionamento dos processadores, o paralelismo e o sistema de memória [12]. • Principais características e funcionalidades do processador Cell [13]. São apresentados detalhes do funcionamento de cada uma das estruturas que compõe a arquitetura Cell, e sua organização é comparada com a de outros processadores, dentre eles o Emotion Engine, core do console PlayStation 2. • Utilização dos processadores Cell no PlayStation 3 [14]. • Explica sobre a arquitetura do Cell e também apresenta uma discussão sobre o seu desempenho [15]. • Página com vários artigos sobre como desenvolver aplicações de alto desempenho para a arquitetura Cell [16]. • A página da Wikipédia sobre o Cell explica por alto as características da arquitetura e dá uma visão geral do processador [17]. • Explica o potencial do Cell para computação científica [18]. • Artigo de alunos da UNICAMP mostrando os benefícios que o processador Cell apresenta em relação ao paralelismo [19]. • Slides da IBM que justificam a necessidade de se usar Cell [20]. • Artigo explicando a arquitetura Cell, de forma relativamente simples, fornecendo alguns dados técnicos [21]. • Artigo explicando a arquitetura Cell, de forma relativamente simples, fornecendo alguns dados técnicos [22]. • Artigo explicando a arquitetura Cell, de forma relativamente simples, fornecendo alguns dados técnicos [23]. • Um site da Sony explicando minuciosamente a arquitetura [24]. O domínio é japonês, mas está em inglês com PDF muito bons (e grandes). É bem detalhista, mas é bom para entender direito como é a arquitetura. • Uma visão geral da arquitetura exemplificando eficiência, aplicações, etc [25]. • Um pouco mais abrangente relatando a estrutura do processador, fluxo de dados, programação para o Cell, entre outros [26]. • Notícia falando sobre o projeto de integrar o Cell Broadband Engine num poderoso mainframe da IBM para lidar com a nova geração de aplicações do mundo virtual, como a Internet 3D [27]. • Notícia falando sobre o uso do Cell Broadband Engine para criar imagens médicas [28]. • Artigo da Wikipédia falando sobre as duas versões do Cell já existentes hoje e das próximas versões a serem lançadas [29] (de acordo com o Roadmap da Intel). • Artigo falando sobre estratégias que podem ser utilizadas por compiladores para aumentar a eficiência de utilização do Cell. Como evitar cenários onde a arquitetura está sujeita a grandes penalidades, o que ocorre, por exemplo, quando o compilador não consegue dar boas "dicas" de branch prediction em aplicações que possuem Arquitetura Cell Broadband Engine 5 muitos comandos condicionais. [http://dcon.com.br/jd.comment/intro-cell-be-pt_BR.pdf PDF que apresenta uma visão clara da arquitetura do processador Cell, descrevendo seu funcionamento e mostrando suas vantagens [30]. • Uma explicação do processador através de sua utilização nos jogos [31]. • Visão geral das características de desempenho do Cell BE [15]. São apresentadas informações referentes ao pipeline do processador e ao relacionamento com memórias cache. Além disso, são mostrados exemplos de aplicações e suas características de desempenho. Por exemplo, são mostradas comparações de resultados de desempenho envolvendo precisão dupla, decodificação de vídeo MPEG-2 e multiplicação de matrizes. • Artigo que apresenta, de forma bastante resumida, as principais características e funcionalidades do processador Cell BE [13]. Sua organização é comparada, inclusive, ao Emotion Engine, core do console PlayStation 2. Esse conteúdo pode ser bastante importante na auxílio à determinação de tópicos a serem explorados na discussão global sobre o processador em questão. • Artigo bastante interessante que dá detalhes sobre a arquitetura e fala um pouco sobre o futuro do Cell [32]. • Apresentação sobre a arquitetura Cell [33]. • Apresentação da IBM sobre Cell Broadband Engine [34]. • Integração entre Cell Broadband Engine e Mainframe [27]. • Introdução à arquitetura Cell Broadband Engine [35]. Dando enfoque à aplicações de processamento de sinal, pois é notado pelos autores que esta arquitetura se destaca nesta área. Os autores também explicam os atributos fundamentais da arquitetura que determinam estas vantagens de performance do Cell. • Manual da arquitetura Cell Broadband Engine [36]. São descritos, com minúcia, os detalhes técnicos da arquitetura e de todos seus componentes. • Funcionamento, sistema de memória e cache e os componentes do processador [11]. • Explica bem o funcionamento dos processadores, o paralelismo e o sistema de memória [12]. • Ambiente de código aberto para Sistemas de software em Cell Broadband Engine [1] • Ambiente de código aberto para Sistemas de software em Cell Broadband Engine [37] • Apresentação da IBM sobre o projeto da eficiência do processador Cell [38]. • Artigo que apresenta diversos modelos de programação para o Cell Broadband Engine (CBE) Processor, dos mais simples aos mais avançados [39]. • Slides explicando detalhadamente a arquitetura do Cell, dando ênfase ao quesito performance [40]. • Uso da arquitetura Cell em um problema real com contém uma comparação de performance com o Core 2 Duo [41]. Simulação de fluxo de sangue no cérebro humano. • Editorial sobre as limitações do Cell para uso em aplicações científicas [42]. • Descreve a criação de um compilador de Fortran para o Cell [43]. • Exemplo de aplicação apresenta conclusões interessantes [44]. • Excelente artigo sobre programação no Cell [4]. Referências [1] http:/ / www. research. ibm. com/ people/ m/ mikeg/ papers/ 2007_ieeecomputer. pdf [2] http:/ / cell. scei. co. jp/ pdf/ CBE_Architecture_v101. pdf [3] http:/ / www. netlib. org/ utk/ people/ JackDongarra/ PAPERS/ scop3. pdf [4] http:/ / www. pad. lsi. usp. br/ joomla/ index. php?option=com_docman& task=doc_download& gid=79 [5] http:/ / www. alphaworks. ibm. com/ tech/ cellsw [6] http:/ / www. cellperformance. com/ articles/ 2006/ 11/ crosscompiling_for_ps3_linux. html [7] http:/ / mnagano. wordpress. com/ 2007/ 07/ 12/ relembrando-peter-hofstee-o-pai-do-cell/ #more-229 [8] http:/ / news. zdnet. com/ 2100-9593_22-6042132. html [9] http:/ / domino. watson. ibm. com/ comm/ research. nsf/ pages/ r. arch. innovation. html [10] http:/ / www. blachford. info/ computer/ Cell/ Cell0_v2. html [11] http:/ / dcon. com. br/ jd. comment/ intro-cell-be-pt_BR. pdf [12] http:/ / domino. research. ibm. com/ library/ cyberdig. nsf/ papers/ 1B2480A9DBF5B9538525723D0051A8C1/ $File/ rc24128. pdf [13] http:/ / www. ic. unicamp. br/ ~ducatte/ mo401/ 1s2006/ T2/ 011104-T. pdf [14] http:/ / www2. dcc. ufmg. br/ projetos/ cggt/ lib/ exe/ fetch. php?w=& h=& cache=cache& media=playstation3. pdf Arquitetura Cell Broadband Engine 6 [15] http:/ / www. ibm. com/ developerworks/ power/ library/ pa-cellperf [16] http:/ / www-128. ibm. com/ developerworks/views/ power/ libraryview. jsp?search_by=programming+ high-performance+ applications+ on+ the+ Cell+ BE+ processor [17] http:/ / en. wikipedia. org/ wiki/ Cell_%28microprocessor%29 [18] http:/ / www. lbl. gov/ Science-Articles/ Archive/ sabl/ 2006/ Jul/ CellProcessorPotential. pdf [19] http:/ / www. ic. unicamp. br/ ~rodolfo/ Cursos/ mc722/ 2s2006/ Trabalho/ g02-texto. pdf [20] http:/ / beatys1. mscd. edu/ compfront/ 2006/ cf06-gschwind. pdf [21] http:/ / arstechnica. com/ articles/ paedia/ cpu/ cell-1. ars [22] http:/ / arstechnica. com/ articles/ paedia/ cpu/ cell-1. ars/ 2 [23] http:/ / arstechnica. com/ articles/ paedia/ cpu/ cell-2. ars [24] http:/ / cell. scei. co. jp/ e_download. html [25] http:/ / www. kaboodle. com/ reviews/ the-cell-architecture [26] http:/ / moss. csc. ncsu. edu/ ~mueller/ cluster/ ps3/ doc/ CellProgrammingTutorial/ BasicsOfCellArchitecture. html [27] http:/ / www. technologynewsdaily. com/ node/ 6824 [28] http:/ / www. dailytech. com/ Cell+ Broadband+ Engine+ Does+ Medical+ Imaging/ article6866. htm [29] http:/ / en. wikipedia. org/ wiki/ Cell_microprocessor_implementations [30] http:/ / cag. csail. mit. edu/ crg/ papers/ eichenberger05cell. pdf [31] http:/ / mnagano. wordpress. com/ 2007/ 07/ 12 [32] http:/ / www. devhardware. com/ c/ a/ Computer-Processors/ Cell-Inside-the-Future-of-Processor-Architecture [33] http:/ / www. google. com. br/ url?sa=t& ct=res& cd=13& url=http%3A%2F%2Fwww. ps3land. com%2FCELL. ppt& ei=V3TXRoOkBoeiev2i4NAM& usg=AFQjCNFhAAjRQZsmNF-JHCiE3pqng0Hocg& sig2=LZ7jpMF4mPCGCoITwpQKtA [34] http:/ / www. gpgpu. org/ sc2006/ workshop/ presentations/ Paolini_IBM_Cell. pdf [35] http:/ / www-01. ibm. com/ chips/ techlib/ techlib. nsf/ techdocs/ D21E662845B95D4F872570AB0055404D/ $file/ 2053_IBM_CellIntro. pdf [36] http:/ / www-01. ibm. com/ chips/ techlib/ techlib. nsf/ techdocs/ 1AEEE1270EA2776387257060006E61BA/ $file/ CBEA_v1. 01_3Oct2006. pdf [37] http:/ / homepages. dcc. ufmg. br/ ~yurif/ lpp/ 2007_ieeecomputer. pdf [38] http:/ / www. cerc. utexas. edu/ vlsi-seminar/ spring05/ slides/ 2005. 02. 16. hph. pdf [39] http:/ / www-128. ibm. com/ developerworks/ power/ library/ pa-fpfunleashing [40] http:/ / www. casesconference. org/ cases2005/ pdf/ Cell-tutorial. pdf [41] http:/ / www10. informatik. uni-erlangen. de/ Publications/ Talks/ 2007/ Goetz_ICMMES07. pdf [42] http:/ / www. hpcwire. com/ hpc/ 679134. html [43] http:/ / www. cs. utk. edu/ ~dongarra/ cell2006/ cell-slides/ 17-Yuan-Zhao. pdf [44] http:/ / www. cs. berkeley. edu/ ~samw/ projects/ cell/ GSPx06Talk. pdf Arquitetura Intel Core e Core 2 7 Arquitetura Intel Core e Core 2 A microarquitetura Intel Core, divulgada em 2006 pela Intel, é uma nova arquitetura que permite um aumento de desempenho combinado à um menor consumo de energia. Possui recursos avançados que permitem um melhor desempenho por Watt. Dentre estes recursos temos uma execução mais rápida de instruções maiores, uma melhora no sistema de consumo de energia que possibilita a desativação temporária de áreas ociosas, um sistema aprimorado de predição de instruções e dados e também algumas novas instruções multimídia. O texto abaixo apresenta em linhas gerais essa nova arquitetura e seus principais recursos. Introdução Os processadores que têm sido desenvolvidos recentemente buscam em sua maioria alcançar o máximo de paralelismo possível. Essa afirmação pode ser verificada facilmente ao se analisar arquiteturas de processadores como os Sun Niagara, Sun Niagara 2 e o IBM/STI Cell. Para alcançar uma maior eficiência em aplicações que exigem maior grau de paralelismo, a tendência atual é que os novos processadores contenham um número cada vez maior de unidades de processamento. Para produzir processadores com tantas unidades de processamento, é necessário diminuir a complexidade de cada unidade de forma a permitir que a produção do processador seja economicamente viável para o fabricante. Essa redução de complexidade pode afetar recursos que antes eram tidos como necessários nos processadores modernos, como a execução fora de ordem [1], utilizada para aumentar o número de instruções realizadas em um ciclo de clock. Neste contexto temos a introdução de processadores baseados na microarquitetura Core da Intel, que busca aperfeiçoar ainda mais os complexos recursos existentes nos processadores modernos e ao mesmo tempo atacar o problema do processamento de aplicações paralelas acrescentando vários núcleos de processamento a um único processador. Conceito de desempenho O desempenho [2] de um processador não pode ser medido apenas como uma proporção direta da frequência do relógio do processador, ou mesmo como a quantidade de instruções realizadas por ciclo do processador (IPC). O desempenho é dado pela simples equação: Desempenho = Frequência IPC Desta forma temos duas maneiras principais de aumentar o desempenho de um processador, aumentando a frequência ou o throughput. Assim, o aumento da capacidade de processamento depende da microarquitetura do processador e do aumento da frequência, ambos dependentes de como o processador é projetado e construído. Arquitetura A tendência atual dos processadores voltados para ambientes paralelos é não implementar execução de instruções fora de ordem. A execução fora de ordem permite que uma seqüência de instruções enviadas para o processador sejam processadas internamente em uma ordem diferente da seqüência original, que busca aumentar o número de instruções processadas de acordo com a arquitetura do processador, ordenando novamente na seqüência original após o término da execução. Processadores que não contam com esse recurso precisam que o ordenamento das instruções seja feito antes de enviadas para o processador, através de otimizações feitas por um compilador, por exemplo. A arquitetura Core foge à regra e busca aperfeiçoar as técnicas já existentes. Assim, cada núcleo de processamento é altamente eficiente e ao mesmo tempo complexo, dificultando a criação de processadores que possuam muitos núcleos. Espera-se que ganhos expressivos de poder de processamento sejam alcançados com a adição de novos núcleos de processamento aos processadores, ao contrário da estratégia anterior da Intel com a arquitetura NetBurst, onde os ganhos eram alcançados principalmente com avanço das técnicas de fabricação que permitissem que os Arquitetura Intel Core e Core 2 8 processadores funcionassem a frequências cada vez maiores. Abaixo encontra-se um diagrama simplificado de um núcleo de processamento (core) baseado na arquitetura Intel Core: O dito popular que a Intel parece ter seguido ao desenvolve a arquitetura Core foi "Mais é Melhor". A arquitetura Core possui uma quantidade maior de cada unidade ou recurso que pode ser encontrada em uma unidade de processamento. A arquitetura Core possui mais lógica de decodificação, melhor reordenação de instruções, mais estações de reserva, mais hardware de execução, maiores buffer's e outros recursos encontrados nos mais de 150 milhões de transistores de cada processador baseado na arquitetura Core. Apesar da adição de mais recursos à arquitetura Core, existem limites ao número de instruções que podem ser executados simultaneamente em um núcleo de processamento. Quanto maior o número de instruções a unidade de execução do núcleo pode processar simultaneamente, maior a dificuldade em manter a unidade de execução completamente ocupada, pois as instruções em execução não podem possuir dependências entre sí. Se várias instruções que possuem interdependências são enviadas à unidade de execução, apenas uma é executada enquanto as outras aguardam o término da primeira. Além disso, a latência do acesso à memória pode fazer com que a unidade de execução fique ociosa aguardando instruções e dados. A arquitetura Core possui várias funcionalidades e soluções que visam manter a poderosa unidadede execução ocupada. Essas funcionalidades buscam principalmente minimizar o envio simultâneo de instruções que possuam dependência para a unidade de execução e minimizam o número de acessos à memória. A Intel atribuiu nomes a cada uma dessas soluções, que são explicadas em maiores detalhes nas seções a seguir. Arquitetura Intel Core e Core 2 9 Intel Wide Dynamic Execution A Execução Dinâmica é uma combinação de técnicas como a análise do fluxo de dados, execução especulativa, execução fora de ordem e tecnologia superescalar onde se tem mais de uma unidade de execução. A primeira vez que esta tecnologia foi usada pela Intel foi na microarquitetura Intel de 6ª geração, conhecida como P6, usada nos processadores Pentium Pro, Pentium II, and Pentium III. Para a microarquitetura Intel NetBurst, foi introduzido o Advanced Dynamic Execution, um dispositivo de execução especulativa proposto para manter a continuidade da execução de instruções dentro do processador. Além disso, a NetBurst possui um algoritmo de previsão de desvio (branch-prediction) mais eficaz diminuindo o número de reconfigurações do pipeline. Com a microarquitetura Intel Core tem-se um ganho significativo da capacidade de despachar execuções devido ao Intel Wide Dynamic Execution. Essa tecnologia possibilita uma maior entrega de instruções por ciclos de clock melhorando tanto o tempo de execução como a utilização eficaz de energia. Cada núcleo de execução é, digamos, mais largo, possibilitando que cada núcleo busque, despache, execute e retorne até quatro instruções completas simultaneamente. Anteriormente a NetBurst podia trabalhar com ate três instruções por tempo, um ganho de desempenho de 33%. Outras melhorias incluem um melhor algoritmo de previsão de desvio, buffers de instruções maiores o que possibilita mais flexibilidade na execução além de outras melhorias que reduzem o tempo de execução. Macrofusion© Macrofusion é uma nova característica da nova arquitetura que permite reduzir o tempo de execução. Nas gerações anteriores cada instrução era decodificada individualmente e então executada. Com a Macrofusion permite-se que pares de instruções comuns, por exemplo, uma comparação seguida de um desvio condicional, sejam combinadas em uma única instrução interna (micro-op) durante a decodificação. Assim duas instruções do programa podem ser executadas como um único micro-op, reduzindo o trabalho total que o processador deveria realizar. Esta propriedade aumenta o número de instruções executadas por unidade de tempo ou reduz o tempo necessário para se executar certo conjunto de instruções. A conclusão direta é que a Macrofusion possibilita uma melhor resposta do processador com menos gasto de energia. Para facilitar a Macrofusion uma nova e aprimorada unidade lógica e aritmética (ALU) foi desenvolvida para a microarquitetura Core. Esta nova ALU executa instruções combinadas pela Macrofusion em um único ciclo de clock. A microarquitetura Intel Core também aprimorou a técnica de fusão de micro-op utilizado pela primeira vez na linha Pentium M. Essa técnica visa uma melhor utilização da energia do processador. Nos modernos processadores as instruções x86 dos programas, chamadas macro-op, são desdobradas em unidades menores de execução, os micro-ops, antes de serem despachados ao pipeline para o processamento. Esta fusão de micro-op é realizada nos micro operadores que possuem o mesmo macro-op para reduzir o número de instruções que realmente serão executadas. Isso possibilita um melhor escalonamento de instruções aumentando o throughput da máquina. Alguns estudos mostram que a fusão destes operadores pode reduzir em mais de 10% o número de micro-ops manipulados pela lógica do processador. Arquitetura Intel Core e Core 2 10 Intel Intelligent Power Capability Intel Intelligent Power Capability foi desenvolvido, basicamente, para reduzir o consumo de energia e temperatura do processador. Esta inovação gerencia o consumo de energia em tempo de execução nos núcleos ativos. O resultado é a uma otimização na relação desempenho/consumo em todas as esferas de computação. Para fazer isso, a microarquitetura Core possui aprimoramentos em recursos já existentes em processadores anteriores da Intel e alguns novos recursos; Recursos de famílias anteriores: •• Intel Speedstep: A tecnologia Intel Speedstep permite que a frequência de operação (através da alteração de razão entre FSB e clock) e a tensão do núcleo de um processador sejam alterados em tempo de execução. Alguns fatores que podem levar à alteração da frequência e tensão são a fonte de energia do sistema (bateria ou fonte), estado térmico do processador. Outro fator importante é a política de gerenciamento de energia do sistema operacional, que pode selecionar o nível de economia de energia baseando-se, por exemplo, na utilização do processador. •• Enhanced Intel Speedstep: Todas as vezes que ocorre uma variação na frequência do processador, este fica indisponível por um curto período de tempo, enquanto que a variação na tensão do núcleo do processador não ocasiona esta indisponibilidade. O enhanced Speedstep permite que a tensão varie independentemente da frequência do processador (no Intel Speedstep a variação de tensão e frequência sempre ocorria em conjunto). Esta alteração melhora a disponibilidade do processador ao permitir que seu consumo seja reduzido sem a necessidade de alterar sua frequência •• Enhanced Halt State (Estado C1E): O processador entra no estado C1E (estado econômico de energia) quando o sistema operacional envia um comando HALT. Nos sistemas operacionais atuais este comando é enviado quando o sistema não encontra-se com carga máxima de utilização. Quando está no estado C1E a frequência do processador é alterada para o mínimo (através da alteração do multiplicador) além da tensão também ser reduzida. Novos Recursos: •• Desabilitação seletiva de subsistemas: Processadores baseados na microarquitetura Core podem desabilitar unidades internas que não estejam sendo utilizadas. Essas unidades não são o núcleo inteiro, mas subsistemas como a ALU (unidade lógico-aritmética) e barramentos internos, que agora podem ser alimentados separadamente. A grande dificuldade nas implementações anteriores desse recurso é que ao alimentar novamente as unidades é necessário aguardar um curto período de tempo até que elas estejam novamente prontas para utilização. A implementação da Intel não aumenta o tempo de resposta ao religar unidades que não estavam em uso. •• Medição distribuída de temperatura: Por causa do novo recurso de desabilitação seletiva de subsistemas, partes diferentes do processador poderão estar ligadas/desligadas dependendo da utilização do sistema, fazendo com que as temperaturas no processador variem de maneira não uniforme. Com essa dificuldade em se medir a temperatura do processador eficazmente, a Intel distribuiu vários sensores de temperatura pelo processador. A temperatura informada para o sistema/usuário e maior temperatura encontrada dentre as medições de todos os sensores de temperatura do processador. Arquitetura Intel Core e Core 2 11 Intel Advanced Smart Cache A arquitetura Intel Core foi desenvolvida desde o começo prevendo-se o suporte a vários núcleos por processador. Diferentemente dos processadores anteriores, os processadores Intel Core com múltiplos núcleos compartilham a memória cache de nível 2 (L2). A primeira vantagem da estratégia de compartilhar o cache L2 é que a quantidade de cache L2 pode ser alterada dinamicamente de acordo com a carga dos núcleos. Em um processador DualCore, quando um núcleo está inativo, o núcleo ativo fica com toda a cache L2 à sua disposição. Quando vários núcleos estão ativos a cache L2 é dividia proporcionalmente entre os núcleos de acordo com a frequência de requisições feitas por cada núcleo à memória. A segunda vantagem é que ao utilizar uma única cache L2 não é necessário utilizartécnicas para garantir a consistência de dados entre as caches dos vários núcleos, diminuindo a utilização do barramento entre o processador e a memória do sistema. Uma terceira vantagem é que o espaço total disponível em cache L2 é melhor utilizado já que quando dois núcleos utilizam os mesmos dados eles não são duplicados em várias caches, sendo compartilhados pelos dois núcleos. A última vantagem é que a microarquitetura Core possui lógica de controle adicional para permitir que os dados da cache L1 de um núcleo sejam transferidos para a cache L1 de outro núcleo passando pela cache L2 compartilhada. Isso permite um passo a menos (não é necessário transferir dados entre as caches L2 de cada núcleo) no compartilhamento de dados entre as caches L1 de diversos núcleos, potencialmente melhorando a performance do sistema quando vários núcleos executam a mesma tarefa. Intel Smart Memory Access Intel Smart Memory Access é o nome de um conjunto de técnicas utilizada para aumentar a performance do sistema de acesso à memória do processador. Consiste das técnicas de Pré-Carregamento [3] e Desambiguação de Memória [4]. Pré-carregamento A primeira técnica utilizada para aumentar a performance é o pré-carregamento [5]de instruções e dados. A microarquitetura possui 6 unidades independentes de pré-carregamento de dados: •• 2 unidades na cache de primeiro nível (L1) do primeiro núcleo •• 2 unidades na cache de primeiro nível (L1) do segundo núcleo •• 2 unidades na cache de segundo nível (L2) compartilhada entre os núcleos A microarquitetura Core possui também 2 unidades independentes de pré carregamento de instruções: •• 1 unidade na cache de primeiro nível (L1) do primeiro núcleo •• 1 unidade na cache de primeiro nível (L1) do segundo núcleo As unidades guardam informações sobre os padrões de acesso das unidades de execução aos dados e padrões de execução do programa. Alguns desses padrões de acesso são: • Assumir se um desvio condicional [6] provavelmente será tomado, baseado na probabilidade da instrução de desvio condicional alterar o fluxo de execução do programa de acordo com o histórico recente dos resultados deste desvio condicional específico. Quando o processador assume que o desvio será tomado, ele encontra o endereço de destino do desvio e começa a executar as instruções do novo local. • Em um loop, os preditores de desvio [7] normalmente assumem que na próxima iteração a execução ocorrerá dentro do loop (a condição para saída do loop é considerada sempre como não verdadeira). Sendo assim, esse preditores de desvio sempre erram a previsão na iteração que sai do loop. A microarquitetura Core introduziu preditores que registram em qual iteração um loop foi interrompido. Na próxima vez que o mesmo loop for executado, se o número de iterações antes de sair do loop for o mesmo, o preditor irá acertar a previsão da última iteração, prevendo-a como uma saída do loop Arquitetura Intel Core e Core 2 12 •• Desvios condicionais indiretos (onde o endereço de destino é carregado de um registrador) são intrinsecamente difíceis de pré-carregar, já que a informação sobre o endereço de destino está indisponível durante o processo de predição. Quando os preditores assumem que um desvio condicional indireto será tomado, eles verificam em uma tabela se o desvio condicional indireto já foi tomado anteriormente e qual foi o seu endereço de destino naquela execução. Os preditores utilizam então esse endereço como o provável destino da execução atual. Desambiguação de memória Os processadores modernos utilizam a execução fora de ordem; uma técnica que altera a ordem em que as instruções são realizadas para permitir que um número maior de instruções esteja em execução em um determinado momento. Quando ocorre uma instrução STORE seguida de um LOAD, podem acontecer duas situações: •• O LOAD vai tentar carregar o dado que foi salvo pelo STORE, sendo assim a ordem de execução das instruções não pode ser alterada. •• O LOAD vai carregar um dado diferente do salvo pelo STORE, sendo assim ele pode ser executado antes do STORE O problema é que para diferenciar os dois casos, é necessário saber os endereços de memória onde o STORE está salvando os dados. Este endereço só fica disponível alguns ciclos após o início da execução do STORE. Como conseqüência, o processador deve aguardar um ciclo após o início da execução do STORE para decidir se o LOAD já pode começar a ser executado (em paralelo com o STORE) ou se o seu início deve ser postergado para depois da finalização da execução do STORE. Estudos[8] indicam que em mais de 97% dos casos não existe dependência entre os dados de STORE e LOAD consecutivos. Isso quer dizer que o LOAD poderia até ser executado antes do STORE. Como resultado, uma instrução ADD após o LOAD-STORE, por exemplo, é executada em 5 ciclos (STORE -> define endereço -> LOAD-> espera load -> ADD), enquanto poderia ter sido executada em 3 ciclos (LOAD -> STORE / espera load -> ADD). Para solucionar o problema, a microarquitetura Core possui algoritmos que determinam com uma grande probabilidade se um par de instruções STORE-LOAD está operando sobre os mesmos dados, sem a necessidade de aguardar a definição dos endereços de memórias que as instruções estariam acessando. Vamos verificar como exemplo da desambiguação de memória o que acontece para a seguinte seqüência de instruções: • 'STORE 13 REF' - Guardar o valor 13 na posição REF da memória. • 'LOAD REF A' - Carregar o conteúdo da posição REF da memória no registrador A. • 'ADD A, B, C' - Somar os registradores A e B, atribuindo o resultado ao registrador C. Arquitetura Intel Core e Core 2 13 No exemplo existem duas posições de memória, uma representada pelo quadrado vermelho e outra representada pelo quadrado azul. O sombreamento saindo dos quadrados indica que a instrução acessando aquele endereço de memória ainda não finalizou. Cada linha cinza representa um ciclo de execução do processador. • Caso A: Nesse caso o LOAD vai carregar no registrador A as informações salvas na posição de memória vermelho pelo STORE, sendo assim ele fica impedido de iniciar sua execução até que o STORE seja finalizado. •• Caso B: Nesse caso o LOAD e o STORE estão trabalhando com posições de memória diferentes. Como esta independência só é descoberta após o ciclo de decodificação do STORE, a única alternativa possível é iniciar a execução do LOAD após o ciclo de decodificação do STORE. Este é o funcionamento das arquiteturas Intel anteriores à arquitetura Core. • Caso C: Este caso ilustra o funcionamento da Desambiguação de Memória da arquitetura Core para a situação descrita no Caso B. O LOAD e o STORE estão trabalhando com posições de memória diferentes, mas através dos algoritmos de Desambiguação de Memória a independência é descoberta antes do STORE iniciar sua execução. Sendo assim, existe a alternativa de executar o LOAD antes do STORE. Nesse caso o LOAD termina sua execução mais cedo, permitindo que o ADD dependente do LOAD (ambos acessam o registrador A) também seja executado antes. Intel Advanced Digital Media Boost O Intel Advanced Digital Media Boost é um recurso que melhora significativamente a performance quando executa instruções SSE. Tanto as operações de ponto de flutuação com dupla precisão da SIMD em 128-bits como as operações aritméticas de inteiros SIMD em 128-bits reduzem o número total de instruções necessárias para executar uma determinada tarefa do programa, e como resultado pode contribuir para um aumento total da performance. Eles aceleram uma grande quantidade de aplicações, incluindo vídeo, som, imagem, processamento de fotos, encriptação, financeiras, científicas e de engenharia. As instruções de SSE intensificam a arquitetura da Intel ao permitir que os programadores desenvolvam algoritmos que podem misturar pacotes de pontos de flutuação de precisão individual com inteiros, usando tanto as instruções SSE como as instruçõesMMX, respectivamente. Em várias das antigas gerações de processadores, as instruções SSE, SSE2 e SSE3 em 128 bits eram executadas em um nível sustentado de uma instrução completa a cada dois ciclos de relógio—por exemplo, a mais baixa em 64 bits em um ciclo e a mais alta em 64 bits no próximo ciclo. O recurso Intel Advanced Digital Media Boost permite que estas instruções em 128-bits sejam completamente executadas em um nível de rendimento de uma por ciclo de relógio, efetivamente dobrando a velocidade da execução para estas instruções. Isto aumenta ainda mais a eficiência total da Microarquitetura Intel® Core™ através do aumento do número de instruções controladas por ciclo. O recurso Intel Advanced Digital Media Boost é particularmente útil para a execução de importantes operações de Arquitetura Intel Core e Core 2 14 multimídia envolvendo gráficos, vídeo e áudio e para o processamento de outros conjuntos de dados ricos que utilizam instruções SSE, SSE2, e SSE3. Referências [1] Do Estrangeirismo Out of order execution - OOO [2] Também conhecido pelo estrangeirismo performance [3] Também conhecido pelo estrangeirismo prefetch [4] Também conhecido pelo estrangeirismo Memory disambiguation [5] Também conhecido pelo estrangeirismo prefetch [6] Também conhecido pelo estrangeirismo branch [7] Também conhecidos pelo estrangeirismo branch predictors [8][8] S. Sethumadhavan, et al. Scalable Hardware Memory Disambiguation for High ILP Processors. In 36th Annual International Symposium on Microarchitecture, 2003. • Inside Intel® Core™ Microarchitecture. Melhor texto introdutório sobre a Arquitetura (http:/ / download. intel. com/ technology/ architecture/ new_architecture_06. pdf) • Página da Intel sobre multicore. Um bom tópico introdutório (http:/ / www. intel. com/ multi-core/ index. htm) • Uma intrudução ao multicore Intel. Clube do Hardware (http:/ / www. clubedohardware. com. br/ artigos/ 1203/ 1) • Uma excelente apresentação com animações e textos explicativos da Intel. ( Em Ingles) (http:/ / www. intel. com/ technology/ computing/ dual-core/ demo/ popup/ demo. htm) • Intel vs. AMD Gaming Benchmarks (http:/ / www. extremetech. com/ article2/ 0,1697,1997469,00. asp) • Um bom texto sobre a arquitetura Multicore Intel e do Athlon X2 (http:/ / mega. ist. utl. pt/ ~ic-micro/ relatorios/ g11. pdf) Arquitetura Intel Core e Core 2 15 • Benchmarks Avaliados pelo Tom's Hardware (http:/ / www23. tomshardware. com/ cpu_mobile. html?model1=701& model2=704& chart=261) • Novas Instruções Intel (http:/ / download. intel. com/ technology/ architecture/ new-instructions-paper. pdf) • Intel Core WhitePaper (http:/ / www. intel. com/ technology/ architecture-silicon/ intel64/ 45nm-core2_whitepaper. pdf) • Making the Move to Quad-Core and Beyond (http:/ / www. intel. com/ technology/ architecture/ downloads/ quad-core-06. pdf) • Inside Intel® Core Microarchitecture and Smart Memory Access (http:/ / download. intel. com/ technology/ architecture/ sma. pdf) • Setting New Standards for Energy-Efficient Performance (http:/ / download. intel. com/ technology/ architecture/ new_architecture_06. pdf) Referências por tópicos 1.1. INTRODUÇÃO • Inside Intel® Core™ Microarchitecture. Melhor texto introdutório sobre a Arquitetura (http:/ / download. intel. com/ technology/ architecture/ new_architecture_06. pdf) 2.2. Intel Wide Dynamic Execution • Por Dentro da Microarquitetura Intel Core Unidades de Execução (http:/ / www. clubedohardware. com. br/ artigos/ 1203/ 4) • Evolution of the multi-core processor architecture Intel Core: Conroe, Kentsfield... (http:/ / www. digital-daily. com/ cpu/ new_core_conroe/ index02. htm) 3.3. Intel Intelligent Power Capability • Energy-Efficient Performance (http:/ / www. intel. com/ technology/ eep/ index. htm?iid=technology_eepdescription+ tabs_overview) • (http:/ / www. xbitlabs. com/ articles/ cpu/ display/ core2duo-preview_8. htm) 4.4. Intel Advanced Smart Cache • Dentro da Microarquitetura Intel® Core (http:/ / www. intel. com/ portugues/ technology/ magazine/ archive/ 2006/ apr/ revista0406_1. pdf) • Cache de Memória e Unidade de Busca (http:/ / www. clubedohardware. com. br/ artigos/ 1203/ 2) • Getting Ready to Meet Intel Core 2 Duo: Página 6 (http:/ / www. xbitlabs. com/ articles/ cpu/ display/ core2duo-preview_6. html) 5.5. Smart Memory Access • Cache de Memória e Unidade de Busca (http:/ / www. clubedohardware. com. br/ artigos/ 1203/ 2) • Inside Intel® Core™ Microarchitecture and Smart Memory Access (http:/ / download. intel. com/ technology/ architecture/ sma. pdf) • Cache de Memória e Unidade de Busca (http:/ / www. clubedohardware. com. br/ artigos/ 1203/ 2) • Getting Ready to Meet Intel Core 2 Duo: Página 7 (http:/ / www. xbitlabs. com/ articles/ cpu/ display/ core2duo-preview_7. html) 6.6. Intel Advanced Digital Media Boost • Extending the World’s Most Popular Processor Architecture (http:/ / download. intel. com/ technology/ architecture/ new-instructions-paper. pdf) • Caminho Interno de Dados de 128 bits (http:/ / www. clubedohardware. com. br/ artigos/ 1203/ 5) • Getting Ready to Meet Intel Core 2 Duo: Página 5 (http:/ / www. xbitlabs. com/ articles/ cpu/ display/ core2duo-preview_5. html) 7.7. Intel(r) Integrated Performance Primitives (Intel(r) IPP) Arquitetura Intel Core e Core 2 16 • - Exemplos de Códigos em vários modelos de programações OpenMP, Pthreads, TBB. Multi-thread apps for Multi-core (http:/ / softwarecommunity. intel. com/ Wiki/ Threading/ 4. htm) • Intel Technology Magazine: Preparção de Aplicações para a Arquitetura Intel Core (http:/ / www. intel. com/ technology/ magazine/ computing/ core-programming-0606. pdf) 8.8. Benchmarks • Intel Core 2 Extreme QX6700, uma avaliação do site bit-tech (http:/ / www. bit-tech. net/ hardware/ 2006/ 11/ 02/ intel_core_2_extreme_qx6700/ 1. html) • Defesa de Mestrado da Universidade da Lousiana Performance Analysis of Intel Core 2 Duo Processor (http:/ / etd. lsu. edu/ docs/ available/ etd-06122007-093459) • Consumo máximo de vários processadores (http:/ / users. erols. com/ chare/ elec. htm) Arquitetura Sun Niagara e Niagara II A arquitetura Niagara e Niagara II foi projetada para prover uma solução de alto desempenho para servidores de aplicações comerciais. Ela suporta 32 threads e explora o paralelismo a nível de threads inerente às aplicações de servidor combinado a baixos níveis de consumo de energia. O texto abaixo apresenta essa nova abordagem e seus principais recursos. Primeiro é apresentado uma introdução justificando a abordagem adotada no projeto do Niagara. Depois será apresentado os detalhes técnicos da arquitetura Niagara, as suas limitações e as melhorias do Niagara 2. Na próxima seção será apresentado as aplicações, sistemas operacionais, linguagens e modelos de programação compatíveis com essa arquitetura. Por últimos, as conclusões e um pouco sobre o futuro do Niagara. Introdução Ao longo das duas últimas décadas, os projetistas de microprocessadores têm focado na melhoria do desempenho de uma única thread, aumentando a freqüência e explorando paralelismo a nível de instrução (ILP), utilizando técnicas tais como execução de várias instruções, execução fora de ordem e previsão de branches. A ênfase na melhoria do desempenho de uma única thread tem apresentado cada vez menos resultados devido às limitações em termos de latência de memória principal e as inerentes aplições com baixo ILP. Isto levou a uma explosão de complexidade nos projetos dos microprocessadores e tornou a dissipação de calor uma grande preocupação. Arquitetura Sun Niagara e Niagara II 17 Por estas razões, o processador Niagara da Sun Microsystems apresenta uma abordagem radicalmente diferente para o projeto de um novo micropocessador.Ao invés de focar sobre o desempenho de uma única ou duas threads, a Sun otimizou o Niagara para um obter desempenho em servidores comerciais multithread. Essa abordagem aumenta o desempenho da aplicação melhorando o throughput. Isso é especialmente eficiente em servidores comerciais de aplicações como banco de dados e serviços Web, no qual tendem ter cargas de trabalho contendo grande quantidade de paralelismo a nível de threads (TLP). O Niagara é uma implementação totalmente nova da arquitetura do Sparc V9, que explora uma grande quantidade de paralelismo on-chip para prover um alto throughput. O Niagara suporta 32 threads de hardware combinando idéias de multiprocessor chips e multithreading. Vários estudo vem indicando um significante ganho de desempenho utilizando essa abordagem cargas de trabalho multithread. A execução eficiente de várias threads esconde a latência da memória. Entretanto, ter 32 threads exigem do sistema de memória a necessidade de uma alta largura de banda. Quatro controladores de memória independentes dentro do Niagara conseguem prover cerca de 20 Gbytes/s de largura de banda para a memória. A utilização de TLP tambem permite aumentar significantemente o desempenho sem precisar melhorar a frequência do clock da CPU. Isso e a utilização de pipelines entre múltiplas threads permitem um projeto eficiente em termos de área e de consumo de energia. Os projetistas calculam que o Niagaram dissipa cerca de 60 W de energia, tornando-o muito atrativo para ambientes com alta densidade de computação. Nos date centers, por exemplo, os custos com o consumo de energia e ar condicionado estão se tornando muito significantes. A métrica de desempenho chave para servidores comerciais, como os servidores Web, é a quantidade de requisições atendidas em um intervalo de tempo. Mas outros requisitos, como consumo de energia e ar condicionado, devem ser levados em conta. A utilização de processadores ILP em clusters de servidores funcionando a clocks menores pode ser uma solução. No entanto, o desempenho é diretamente proporcional à frequência do clock e isso faz com que esses processadores apresentem uma perda proporcional no desempenho, tornando essa solução menos desejada. Essa situação motiva a outros requisitos para melhorar o desempenho por Watt. Esses requisitos não são atendidos eficientemente utilizando máquinas otimizadas para o desempenho de uma única thread. Aplicações para servidores comerciais tendem a ter um baixo ILP porque eles tem grandes conjuntos de trabalhos e pouca localidade de referência no acesso a memória; todos os dois contribuem para altas taxas de cache miss. Além disso, branches com dados dependentes são difíceis de prever, assim o processador tem que discartar o trabalho feito na direção errada. A combinação de um baixo ILP disponível e uma alta taxa de cache miss faz com que o acesso a memória seja uma limitação para o desempenho. As aplicações de servidores tendem a ter grande quantidade de TLP. As máquinas de memória compartilhada com processadores de uma thread interconectados possuem um bom desempenho justamente porque exploram o TLP. Entretanto, a utilização de SMP junto composto de vários processadores de uma thread não possuem uma relação custo-benefício tanto para o consumo de energia quanto em termos de custo. Uma abordagem mais eficiente é construir uma máquina composta de cores simples agregados em um único die, com uma cache compartilhada e alta largura de banda com a memória, ou seja, produzindo um SMP server dentro de um chip. O Niagara I representa o primeiro de uma série de microprocessadores que a Sun desenvolverá com várias threads de hardware para prover alto throughput e alto desempenho por Watt em aplicações de servidores comerciais. A disponibilidade de uma arquitetura rica em threads abre novas oportunidades para os desenvolvedores aumentarem o desempenho das suas aplicações. Essa arquitetura é uma mudança de paradigma no projeto de microprocessadores. Após o lançamento do Niagara, a Sun conseguiu sair do vermelho e está faturando alto com as vendas do Sparc T1 (nome comercial da máquina que utiliza o Niagara). Arquitetura Sun Niagara e Niagara II 18 Arquitetura O processador Niagara SPARC é projetado para um baixo cosumo de energia e a alto throughput para servidores comerciais de aplicações, onde o consumo de energia, o resfriamento e o espaço são as principais preocupações. A arquitetura de multithreaded chip (CMT) alcança altos throughput enquanto otimiza o desempenho por watt. A execução concorrente de 32 threads é implementada através de 8 4-way multithreaded cores simétricos, associados a um sistema de cache/memória de baixa latência e alta largura de banda. A firgura abaixo apresenta o pipeline do Niagara. A abordagem do Niagara para aumentar o throughput nas aplicações de servidores comerciais envolve um grande aumento no número de threads suportados pelo processador e subsistema de memória que deve suportar uma grande largura de banda. O Niagara suporta 32 threads de execução em hardware. A arquitetura organiza cada quatro threads em um grupo de thredas. Esse grupo compartilha o mesmo pipeline de processamento, referenciado como Sparc Pipe. O Niagara possui 8 grupos de threads na CPU. Cada Sparc Pipe possui uma cache L1 para instruções e dados. O hardware esconde os stalls da memória e do pipeline de uma dada thread escalonando outras threads de um mesmo grupo no Sparc pipe com uma penalidade de zero ciclos. As 32 threads compartilham uma cache L2 de 3MB. Nos sistemas SMP convencionais que utilizam processadores discretos com sistema de interconexão coerente, misses de coerência são frequentes sobre os barramentos de baixa frequencia, além de ter altas latências. O Niagara possui uma cache interna ao chip que elimina tais misses e possui uma baixa latência para comunicação entre as caches. A interconexão via crossbar provê uma comunicação entre os Sparc pipes, bancos de cache L2 e outros recursos compartilhados na CPU. Ele provê mais de 200 GB/s de largura de banda. O crossbar também provê uma porta para a comunicação com o subsistema de E/S. A interface de memória é de quatro canais de DDR2 DRAM, suportando uma largura de banda máxima de 20 GB/s e uma capacidade de 128 GB. Formatos de Dados A arquitetura Niagara reconhece os seguintes tipos de dados: inteiro com sinal (8, 16, 32 e 64 bits), inteiro sem sinal (8, 16, 32 e 64 bits), SIMD (Uint8 de 32 bits, Int16 de 64 bits, Int32 de 64 bits) e ponto flutuante (32, 64 e 128 bits). Acompanham esses tipos de dados, os seguintes comprimentos de palavras: byte (8 bits), meia-palavra (16 bits), palavra (32 bits), palavra-marcada (valor de 30 bits e 2 bits de marcação), palavra dupla/extendida (64 bits) e palavra quádrupla (128 bits). Os inteiros com sinal são escritos em complemento-de-dois, enquanto os inteiros sem sinal são escritos usando-se toda sua extensão. Palavras-marcadas têm a marcação nos dois bits menos significativos. Pontos flutuantes têm sua representação normal (IEEE Std 754-1985), alterando apenas os expoentes ({7;0}, {10;0} e {14;0}) e frações ({22;0}, {52;32}+{31;0} e {111;96}+{95;64}+{63;32}+{31;0}), respectivamente para 32, 64 e 128 bits de representação, todas com um bit de sinal. Registradores São vários os tipos de registradores utilizados na arquitetura UltraSPARC: •• uso geral: incluem os registradores de passagem de parâmetro, variáveis locais e globais. Podem ser implementadas janelas de registradores, nas quais os registradores de entrada de uma janela correspondem aos de saída de outra janela, interligando-as. De modo geral, podem haver de 72 a 640 registradores do tipo R em um processador UltraSPARC, sendo que R[0] sempre mantém seu valor em zero, e o comando CALL escreve seu próprio endereço em R[15]; •• ponto flutuante: são 64 registradores de 32 bits, que podem ser acessados como 16 de 128 bits para quádrupla precisão (FQ[0], FQ[4],..., FQ[60]) ou 32 de64 bits para precisão dupla (FD[0, FD[2],...].,FD[62]) ou ainda 32 de 32 bits para precisão simples (FS[0], FS[1],...,FS[31]) e onde se utiliza apenas a primeira metade dos registradores. Há também um registrador especial com grupos de bits para indicar estados especiais dos Arquitetura Sun Niagara e Niagara II 19 registradores de ponto flutuante, como arredondamento e exceções; •• auxiliares de estado: são registradores utilizados para indicar resultados como divisões ou multiplicações de 32 bits, códigos para operações com inteiros (condition codes), contador de ciclos (ticks), disparador de interrupção ao atingir um determinado valor de ciclos (ticks), program counter, e outros. Há registradores especiais reservados para implementações e cada processador virtual conta com seu próprio conjunto de registradores auxiliares, que não são compartilhados; •• estado de janelas de registradores: há um conjunto especial de registradores que controlam qual a janela ativa, se podem ser salvas ou restauradas, se podem ser esvaziadas, etc. Os comandos que lidam com esses registradores são de acesso privilegiado ou hiperprivilegiado. Há um outro conjunto semelhante que só pode ser visto por processos privilegiados, e cada processador virtual conta com um conjunto próprio deles; •• hiperprivilegiados: somente podem ser acessados por processos com esse nível, e contém registradores que informam sobre os estados dos registradores, interrupções, traps e ciclos (ticks). Instruções As instruções da arquitetura Niagara são lidas individualmente pelos processadores virtuais e executadas (ou trapped ou anuladas). Há um registrador chamado NPC (next program counter), que recebe o valor de PC+4 ou um outro valor, caso haja um salto ou transferência de controle, de acordo com o que ocorrer com a instrução. Todas instruções são divididas em 4 formatos e 11 categorias, totalizando 111 instruções. Os 4 formatos são ajustados conforme os dois primeiros bits mais significativos: 00 para operações SETHI e branches, 01 para loads e 10 e 11 para aritmética, lógica, traps, loads, stores e outros. As 11 categorias são acesso à memória (usam 1 ou 2 registradores tipo R para calcular um endereço de memória de 64 bits de espaço e 8 bits de comprimento, além de alinhamento), sincronização de memória (ordem em que são feitos loads/stores), aritmética de inteiros e/ou lógica (shifts, multiplicações, divisões, etc.), transferência de controle (branches, traps, calls e jumps), movimentos condicionais (mover valores de um registrador para outro com certas condições ou comparar registradores, eliminando branches), gerenciamento de janelas de registradores (salvar, restaurar, etc.), acesso a registradores auxiliares (escrita e leitura) e acesso a registradores privilegiados (também de escrita e leitura), operações de ponto flutuante, instruções dependentes da implementação e instruções reservadas. Memória Com capacidade para executar 32 threads simultaneamente, uma interface rápida de acesso a memória é extremamente importante para o Niagara. Para suprir a alta demanda de dados, o processador conta com quatro controladores de memória DDR2 integrados. Ao integrar o controlador de memória com o processador, fazemos com que ele funcione na mesma frequência do processador, recebendo informações da memória muito mais rapidamente. ASI Cada localidade da memória é referenciada por um adress space identifier (ASI) de 8 bits e um endereço de memória de 64 bits. O ASI é utilizado para identificar em que tipo de espaço da memória um endereço se encontra (memória principal, memória secundária, etc.). Além disto, ele fornece um atributo que é único para cada endereço, mapeia registradores internos de um processador virtual e define o formato de acesso a dados (little ou big-endian). Existem três categorias para um ASI, que definem como a MMU vai tratar o endereço de memória: •• Virtual-Translating ASI: O endereço de memória é tratado como virtual e traduzido pela MMU em um endereço físico. •• Non-Translating ASI: O endereço não é modificado pela MMU. Este tipo de ASI é usado geralmente para acessar registradores internos. •• Real-Translating ASI: O endereço de memória é tratado como real e traduzido pela MMU em um endereço físico. É utilizado por softwares com altos privilégios para acessar diretamente a memória utilizando endereços reais ou físicos Arquitetura Sun Niagara e Niagara II 20 Cache Um dos principais limitadores à velocidade de processamento é o tempo de latência das memórias, que é o tempo despendido desde a solicitação de dados pelo processador até o recebimento dos mesmos. Para diminuir os efeitos deste problema, existem os caches: memórias pequenas e rápidas, em um nível mais próximo ao processador, que servem para armazenar os dados e instruções com maior probabilidade de serem solicitados pelo processador. Cada core do processador Sun Niagara possui um cache L1 de 24kB, dividido em um cache de instruções de 16kB, com blocos de 32B e um cache de dados de 8kB, com blocos de 16B, ambos four-way set associative. O processador conta ainda com um cache L2 de 3MB, twelve-way set associative, com blocos de 64B, que é compartilhado entre os 8 cores. Para manter a coerência de cache, é utilizada a técnica de write-through. Se comparado com processadores atuais single-thread, estes caches são pequenos, porém para a arquitetura multicore, multithread do Niagara eles são suficientes. Caches reduzidos também são necessários pelo espaço limitado do die, devido aos múltiplos cores. Quando um processador single-core executa uma única thread e ocorre um cache miss, é necessário esperar até que os dados requisitados sejam obtidos da memória principal. Uma das soluções para este problema é a execução de instruções fora de ordem, mas isto leva a uma maior complexidade do chip. No caso do Sun Niagara, no entanto, não há suporte a esta tecnologia, porém por se tratar de um processador multithread, no caso de precisar buscar dados da memória podemos simplesmente mudar a thread que está sendo executada para outra e aguardar até que os dados sejam obtidos, minimizando os efeitos de um cache miss. Como as penalidades para cache miss são baixas, o processador não precisa depender tanto de técnicas de branch prediction, que unido à falta de suporte à execução de instruções fora de ordem, colabora para tornar a arquitetura mais simples. Crossbar Para que mais de um core possa ter acesso ao cache L2 simultaneamente, ele é dividido em 4 banks. Interconectando os banks do cache L2, os controladores de memória e a unidade de ponto flutuante aos cores, existe uma estrutura chamada Crossbar Switch. O crossbar tem uma taxa de transferência altíssima, cerca de 200GB/s. Sparc Pipe Nesta seção será apresentado a implementação do Sparc pipe, que suporta quatro threads. Cada thread possui um conjunto único de registradores, buffer de instruções e de dados. Cada grupo de threads compartilham a cache L1, a TLB, unidades de execução e a maioria dos registradores do pipeline. Foi implementado um pipeline de propósito único com seis estágios: fetch, thread select, decode, execute, memory e write back). No estágio fetch, a cache de instrução e a TLB de instrução (ITLB) são acessados. O multiplexador de seleção de threads escolhe o contador de programa (PC) de uma das threads, dentre os quatro disponíveis, que executará o acesso. O pipeline busca duas instruções por ciclo. Um bit pré-codificado na cache indica as instruções de latência alta. No estágio de thread-select, o multiplexador de seleção de threads escolhe uma thread dentre as disponíveis para executar uma instrução nos estágios seguintes. Esse estágio também mantém um buffer de instruções. As instruções trazidas da cache na estágio fetch podem ser inseridas no buffer de instrução daquela thread se os estágios seguintes estiverem ocupados. Os registradores do pipeline para os dois primeirosestágios são replicados para cada thread. As instruções da thread selecionada vai para o estágio decode, no qual executa a decodificação da instrução e acessa o register file. As unidades de execução suportadas incluem uma unidade de lógica aritimética (ALU), um shifter, um multiplicador e um divisor. Uma unidade intermediária fica a cargo de passar os resultados para as instruções dependentes ante de atualizar o register file. A instruções da ALU e do shifter possuem latência de um único ciclo e geram os resultados no estágio execute. As operações de multiplicação e divisão possuem longa latência e causam a troca de thread. A unidade de load-store contém a TLB de dados (DTLB), a cache de dados e buffers de armazenamento. Os acessos a cache de dados e a DTLB são feitos no estágio de memória. As instruções de um único ciclo (i.e. ADD) atualizam o register file no estágio write back. Arquitetura Sun Niagara e Niagara II 21 A lógica de seleção de threads decide qual thread está ativa em um dado ciclo nos estágios de fetch e thread-select. Consequentemente, se o estágio thread-select escolhe uma thread para executar um instrução no estágio de decodificação, o estágio fetch tambem seleciona a mesma instrução para acessar a cache. A lógica de seleção de threads utiliza informações de vários estágios de pipeline para decidir quando selecionar ou deselecionar uma thread. Por exemplo, o estágio thread-select pode determinar o tipo da instrução utilizando um bit pré-decodificado na cache de instrução, enquanto algumas traps somente podem ser detectadas em estágios mais avançados do pipeline. Consequentemente, um tipo de instrução pode causar a deseleção de uma thread no estágio thread-select, enquanto uma trap detectada no estágio memory necessita limpar todas as próximas instruções de uma thread e deselecionar ela mesma duranto o processamento da trap. Política de Seleção de Thread A política de seleção de thread consiste em intercalar as threads disponíveis a cada ciclo, dando prioridade para a thread menos recentemente usada. As threads podem ficar insdiponíveis por causa de instruções de latência longa como loads, branches, multiplicação e divisão. Elas tambem ficam indisponíveis por causa de stall no pipeline causados por cache misses, traps e concorrência por recursos. O escalonador de threads assume que todos os load são cache hit and que, consequentemente, provêem um instrução dependente para a execução na mesma thread de maneira especulativa. Entretanto, essa thread especulativa é atribuída com uma prioridade menor na hora de apresentar uma nova instrução comparado com uma outra thread que pode prover uma instrução não-especulativa. Limitações A arquitetura Niagara também apresenta as suas limitações, por isso a Sun já lançou o Niagara II e está em desenvolvendo o projeto Rock [1] com o objetivo de melhorar aida mais o desempenho dessa arquitetura. A primeira limitação é a integração da E/S dentro do processador, que impôs um throughput máximo. A seguir estão os númerod do Niagara: •• PCIe throughput = 2.0 GB/second •• 10Gb Ethernet throughput = 1.25 GB/sec O Throughput total do Niagara para E/S é igual a 2.0 mais 1.25, que totaliza 3.25 GB/sec. Enquanto isso os seus concorrentes, IBM e HP, possuem um throughput máximo de 20 GB/s e 8.5 GB/s respectivamente. Além disso, o Niagara, como já foi dito anteriormente, foi otimizado para aplicações que utilizam multithread e para outros tipos de aplicações ele não adequado. Um outra limitação é que o Niagara possui somente uma unidade de ponto flutuante para todos os cores. Assim, uma aplicação que possui muitas instruções que demandam essa unidade, fazem com que a mesma se torne um gargalo. Por último, o Niagara apresenta somente sistemas com um processador, limitando os ambientes empresariais a uma escalabilidade vertical. Obviamente, que as limitações apresentadas dependem muito da carga de trabalho utilizada. Para sistemas comerciais multithread e com baixa E/S, o Niagara fica muito além dos seus concorrentes. No entanto, ele não atende aos outros tipos de aplicação. Arquitetura Sun Niagara e Niagara II 22 Niagara 2 A segunda versão do Niagara possui uma série de aprimoramentos com o objetivo de diminuir as limitações apresentadas anteriormente. As suas principais melhorias são: •• o Sparc pipe foi modificado e agora consegue processar duas threads simultaneamente, o que totalizam 64 threads de hardware; •• possui 2 portas de 10Gbits incorporadas, o novo modelo permite acesso rápido e fácil comunicação entre os servidores; •• foram adicionadas oito unidades de aceleração criptográfica e um total de 10 funções independentes mapeiam todas as necessidades de segurança, sem comprometer o desempenho do equipamento; •• oito unidades de pontos flutuantes, uma unidade por core, maximizam os benefícios do CMT(Chip Multi Thread) para computação de alta performance; •• agora são oito vias de aplicações rápidas PCI Express como mídia streaming, escrita e leitura de banco de dados e backup de informações; •• o clock aumenteou de 1.4 GHz para 1.2 GHz; •• a cache L2 aumentou de 3 para 4 MB; •• o escalonamento de thread e o prefetching de instrução foram melhorados atingindo um desepenho melhor na execução das threads; •• utilização duas ALUs por core •• quatro controladores de memória dual-channel FBDIMM; •• feito utilizando o processo de 65nm. Aplicações A arquitetura Niagara é considerada ecológica por possuir um baixo consumo de energia em comparação com as outras arquiteturas. Além disso, muitas empresas estão de olho nela, pois o custos por watt e de ar condicionado estão cada vez maiores. Dado que o Niagara possui um ótimo desempenho como servidor Web e o número de usuários de internet cresce cerca de 300 milhões ao ano, qualquer Watt econimizado em uma arquitetura de servidor faz uma enorme diferença. Para desenvolver aplicações para arquiteturas chip multithreads (CMT) várias bibliotecas podem ser utilizadas. A Sun disponibilizou o documento Improving Application Efficiency Through Chip Multi-Threading [2]. Nele são apresentadas as técnicas, bibliotecas e diretrizes para programar nesse tipo de arquitetura. Podem ser utilizados Pthreads ou Solaris threads (disponível somente no sistema operacional Solaris). Além das interface comum para threads como a utilização de mutexes, semaphores e outros, a Solaris apresenta algumas opções interessantes. Dentre essas opções estão Scheduler Activation, que permite a thread comunicar com o escalonados do sistema operacional; Rechoose Interval, que permite transferir as threads de um core para outro; Memory Placement Optimization, que permite que garantir que os dados relacionados a uma thread estarão no core mais próximo que ela se encontra. As threads para esse tipo de arquitetura são as mesmas com quais todos estão acostumados a programar nos processadores single core. Assim, qualquer aplicação desenvolvida em pthreads, por exemplo, para um single core funciona em um processador CMT. As aplicações típicas, como já foi dito, para esse tipo de arquitetura são as aplicações de banco de dados, servidores web e roteadores. Até o momento, somente o sistema operacional solaris suporta a arquitetura do Niagara. No entanto, existem esforços para o Ubuntu [3] suportar o Niagara. Arquitetura Sun Niagara e Niagara II 23 Futuro A Sun já iniciou o desenvolvimento do Niagara 3. Ainda não existem muitas informações sobre o projeto, mas a tendência de aumentar o número de cores, threads e largura de banda continuará. Outro projeto da família do Sparc que está desenvolvimento é o Rock. [1]. A ideia é que o Rock seja escalável e utilizado em servidores para aplicalções high-end. A primeira versão dele possui 16 cores e duas threads por core. Sun ULTRASparc T1 e T2 Os Sun ULTRASparc T1 [4] e T2 [5] são codinomes comerciais para a arquitetura do Niagara. A arquitetura Niagara somente é comercializadaatravés deles, em um pacote completo, que contém o gabinete da Sun, disco, placa mãe e memória principal. As especificações deles podem ser encontradas em: • ULTRASparc T1 [6] • ULTRASparc T2 [7] Referências [1] http:/ / en. wikipedia. org/ wiki/ Rock_processor [2] http:/ / developers. sun. com/ solaris/ articles/ chip_multi_thread. html#2 [3] http:/ / www. ubuntu. com [4] http:/ / en. wikipedia. org/ wiki/ UltraSPARC_T1 [5] http:/ / en. wikipedia. org/ wiki/ UltraSPARC_T2 [6] http:/ / www. sun. com/ processors/ UltraSPARC-T1/ specs. xml [7] http:/ / www. sun. com/ processors/ UltraSPARC-T2/ specs. xml • Niagara: A 32-Way Multithreaded Sparc Processor. (http:/ / ogun. stanford. edu/ ~kunle/ publications/ niagra_micro. pdf) • A Power-Efficient High-Throughput 32-Thread SPARC Processor. (http:/ / www. opensparc. net/ pubs/ papers/ D05_01Aut2. pdf) • The UltraSPARC T1 Processor - High Bandwidth For Throughput Computing. (http:/ / www. sun. com/ processors/ whitepapers/ UST1_bw_v1. 0. pdf) • UltraSPARC Architecture 2005. (http:/ / opensparc-t1. sunsource. net/ specs/ UA2005-current-draft-P-EXT. pdf) Programação em Pthreads 24 Programação em Pthreads Introdução Nesse capítulo serão discutidos alguns pontos fundamentais para se entender a programação em Pthreads, passando pelas motivações, por definições e explicações de conceitos básicos e finalmente dando a diretiva inicial para o assunto abordado, ou seja, a iniciação na programação paralela em Pthreads. Necessidade de processamento massivo: o que acarreta? As necessidades de processamento massivo nos dias de hoje são muitas: cálculos matemáticos, empíricos, processamento de enormes quantidades de dados, números, arquivos, simulações de fenômenos naturais, aplicações gráficas cada vez mais requintadas, aplicações médicas, químicas e científicas em geral. Enfim, há uma infinitude de áreas que demandam a resolução de problemas cada vez mais complexos, com o envolvimento de uma enorme quantidade de operações, instruções e dados, e cada vez mais são necessários computadores e formas de processamento mais rápidas do que as atuais para tais aplicações. Necessidade de paralelismo Vários fatores explicam a necessidade do processamento paralelo. O principal deles trata da busca por maior desempenho. As diversas áreas nas quais a computação se aplica, sejam científicas, industriais ou militares, requerem cada vez mais poder computacional, em virtude dos algoritmos complexos que são utilizados e do tamanho do conjunto de dados a ser processado. Além disso, várias aplicações são inerentemente paralelas, e perde-se desempenho pela necessidade de torná-las seqüenciais. O chamado "gargalo de von Neumann", segundo Almasi, tem diminuído a produtividade do programador, daí a necessidade de novas maneiras de organização do processamento computacional. Contudo, substituir uma filosofia computacional já firmemente estabelecida pelas várias décadas de existência da computação, como é a filosofia de von Neumann, é algo que representa um obstáculo de dimensões muito grandes, e que de certa maneira dificulta a difusão da computação paralela. Necessidade de compartilhamento fácil de memória A necessidade de processamento massivo e de paralelismo leva a uma outra questão, relativa ao compartilhamento de memória em sistemas paralelos. Como os diversos processadores utilizam uma mesma memória física, tal tarefa não é trivial e, em geral, limita a escalabilidade do sistema. Neles, a comunicação é realizada em hardware mediante a troca de mensagens. Isso fica bem claro no nível da aplicação quando o modelo de programação é orientado segundo essa lógica. Porém, embora tal linha de comunicação seja bastante natural, ela pode certamente se mostrar extremamente complicadas em diversas situações, como aquelas nas quais os padrões de interação e compartilhamento de dados são mais complexos e possuem escalas maiores. Além disso, tal lógica exige um maior nível de treinamento por parte dos programadores, o quem nem sempre acontece. De fato, quando passamos para a dimensão do software paralelo, temos dois paradigmas clássicos de programação paralela nesse sentido: o da troca de mensagens, mencionado anteriormente, e o compartilhamento de memória. A programação no paradigma de memória compartilhada é considerada mais simples, pois evita que o programador tenha que se preocupar com a comunicação entre processos, através da troca explícita de mensagens. Para realizar comunicação, um processo apenas escreve dados na memória para serem lidos por todos os outros. Para sincronização, seções críticas podem ser usadas, com a utilização de semáforos ou monitores para garantir exclusão mútua. Programação em Pthreads 25 No paradigma de troca de mensagens a comunicação é realizada através de primitivas que explicitamente controlam o deslocamento dos dados. Troca de mensagens apresenta várias dificuldades, entre elas controle de fluxo, mensagens perdidas, controle do buffer (buffering) e bloqueio (blocking). Embora várias soluções tenham sido propostas, programação com troca de mensagens permanece complicada.[1] Em resumo, os multicomputadores são simples de construir, mas difíceis de programar, enquanto os multiprocessadores são difíceis de construir mais simples de programar.[2] Além disso, com a grande demanda por sistemas paralelos com capacidade de suportar grandes volumes de dados, torna-se evidente a necessidade de maneiras de tornar essa tarefa o mais simples possível para o programador. O que são threads? Um thread, algumas vezes chamada um processo peso leve, é um fluxo seqüencial de controle dentro de um programa. Basicamente, consiste em uma unidade básica de utilização da CPU, compreendendo um ID, um contador de programa, um conjunto de registradores e uma pilha. Um processo tradicional tem um único thread de controle. Se o processo possui múltiplos threads de controle, ele pode realizar mais do que uma tarefa a cada momento. Essa possibilidade abre portas para um novo modelo de programação. Threads são diferentes de processos nos seguintes pontos[3]: Um processo é criado pelo sistema operacional como um conjunto de recursos físicos e lógicos para executar um programa. Um processo inclui: •• Memória de heap, estática e de código; •• Registradores para lidar com a execução do código; •• Uma pilha; •• Informação do ambiente, incluindo um diretório de trabalho e descritores de arquivos; •• IDs de processos, de grupos e de usuários; •• Ferramentas de comunicação entre processos e bibliotecas compartilhadas. Uma thread é o estado de execução de uma instância do programa, chamada algumas vezes de fluxo independente de controle. A thread é uma entidade escalonável. Ela tem propriedades que permitem que ela execute independentemente: •• Registradores para lidar com a execução do código; •• Uma pilha; •• Propriedades de escalonamento (como prioridade); •• Seu próprio conjunto de sinais; •• Algumas informações específicas de threads. Definições Introduzem-se aqui termos e conceitos utilizados na programação multi-threaded. • Escalonamento: normalmente feito pelo sistema operacional, ele determina quais threads executam em determinado momento. • Sincronização: quando um programa pára em um ponto, esperando que determinadas threads terminem seu trabalho, diz-se que houve a sincronização entre as threads. • Granularidade: é o tamanho do trabalho atribuído a cada thread antes que elas se sincronizem. Um programa que seja dividido em partes pequenas entre as threads tem granularidade fina; um programa que faz com que suas threads tenham muito trabalho antes de se sincronizarem tem granularidade grossa. • Zona crítica: uma parte do código que tem comportamento indeterminado caso seja executada por mais de uma thread ao mesmo tempo é chamada de zona crítica. Um exemplo é quando duas threads tentam realizar,
Compartilhar