NVIDIA e AMD: Uma breve comparação de arquiteturas

Com o início da popularização do OpenCL, que permite um mesmo programa utilizar o poder computacional de GPUs tanto da NVIDIA quanto da AMD ou de ambas ao mesmo tempo, é interessante conhecer a arquitetura das GPUs de ambos os fabricantes para melhor desenvolver um algoritmo ou escolher entre os hardwares. É comum os fabricantes de GPUs anunciarem os seus produtos destacando o número de “Cuda Cores” (ou “Stream Processors”, no caso da AMD) que cada um possui. Dessa forma é importante conhecer o que cada fabricante define como “core” da GPU e saber das capacidades de cada um.

Primeiramente iremos analisar a última arquitetura da NVIDIA, conhecida como Fermi (Fig. 1). Com relação à parte de cálculo, a Fermi é dividida em 16 multiprocessadores ou SMs (na Fig. 1, um multiprocessador está destacado em vermelho) e cada multiprocessador é formado por 32 Cuda Cores e outras unidades (Fig. 2). Cada Cuda Core é formado por uma unidade de processamento de ponto-flutuante de precisão simples e outra de processamento de inteiros (em destaque na Fig. 2) e é esse Cuda Core que será responsável por processar um thread do Kernel (quando for exigido apenas precisão simples ou inteiros; observe que o Cuda Core somente irá usar ou a unidade FP ou a INT por vez, de acordo com a instrução pedida, nunca as duas juntas). Com base nessas informações, é possível determinar o número total de “cores” da Fermi como sendo: 16 * 32 = 512 Cuda Cores. Observe que as novas placas baseadas na arquitetura Fermi que acabaram de ser lançadas (Geforce GTX 480) possui 15 multiprocessadores, o que resulta em: 15 * 32 = 480 Cuda Cores.

Fig. 1: Arquitetura Fermi. Visão dos 16 SMs (Streaming Multiprocessor). Fonte: NVIDIA.

Além do número de “cores”, é interessante conhecer o poder computacional em GFlops da Fermi para termos uma boa base de comparação entre diferentes arquiteturas. Para isso, é necessário mais algumas informações: a velocidade que cada “core” está trabalhando, chamado de “Processor Clock” ou “Shader Clock” ou mesmo “Hot Clock”; e como cada “core” executa suas instruções para cada ciclo de clock. A primeira informação é facilmente obtida lendo as especificações de sua placa de video: para a Geforce GTX 480, o processor clock é igual a 1401 MHz (informação obitida pelo site da NVIDIA), já a segunda informação é específico de cada arquitetura, no caso da Fermi, cada núcleo é capaz de executar duas  operações de ponto-flutuante por ciclo de clock, isso equivale a 2 Flops por ciclo de clock. Essas duas operações por clock, na verdade, correspondem a um FMA (fused multiply-add), no qual a seguinte operação matemática é realizada: A = A+B*C (veja que isso representa uma soma e uma multiplicação -> 2 Flops). Com essas informações, já é possível calcular o desempenho máximo da Geforce GTX 480 como sendo: (número de Cuda Cores) * (processor clock, em GHz) * (operações por clock), que equivale a: 480 * 1,401 * 2 = 1345 GFlops (em precisão simples). Observe que se a Geforce GTX 480 tivesse todos os 16 SMs habilitados, ela teria um desempenho igual a: 512 * 1,401 * 2 = 1435 GFlops (em precisão simples).

Fig. 2: Visão detalhada do SM e do CUDA Core. Fonte: NVIDIA.

Para calcularmos o poder computacional para precisão dupla, devemos conhecer como a Fermi lida com esse tipo de dado internamente. Na arquitetura Fermi, quando queremos realizar operações em precisão dupla, os Cuda Cores são utilizados aos pares para executar os cálculos (lembre-se que cada “core” possui uma unidade FP de precisão simples, assim quando dois “cores” são combinados teremos o equivalente a um “core” com uma unidade FP de precisão dupla), o que resulta na metade de “cores” disponíveis para os threads. Assim, o desempenho máximo em precisão dupla para a Geforce GTX 480 é dado por: 480/2 * 1,401 * 2 = 672 GFlops (em precisão dupla).

Com os dados acima, podemos partir para o estudo da arquitetura da AMD, conhecida como “Cypress (RV870)” que está dentro da Radeon HD5870. Na arquitetura AMD, as unidades de cálculo são conhecidas como “SIMD Engines” e a HD5870 possui 20 dessas unidades conforme ilustra a Fig. 3 (destacado em azul). Por sua vez, cada SIMD Engine é formado por 16 “Stream Cores” (destacado em verde na Fig. 3) e está detalhado pela Fig. 4. O “Stream Core” corresponde a unidade básica de cálculo para o RV870, porém o mesmo ainda é constituído por 5 ALUs (Arithmetic Logic Unit) que são responsáveis por realizar as operações númericas exigidas e são chamadas pela AMD de “Stream Processors”. Dentre as 5 ALUs do “Stream Core”, 4 são para uso geral (retângulos mais finos) e capazes de operar em ponto-flutuante ou inteiro. A outra ALU restante (retângulo maior) é reservada para funções especiais (seno, cosseno, log, etc) e também é capaz de operar em ponto-flutuante de precisão simples. Da mesma forma que a Fermi, as ALUs da RV870 são capazes de realizar duas operações de ponto-flutuante em precisão simples por ciclo de clock (instrução FMAD). Assim, o número total de “Stream Processors” presente na Radeon HD5870 é igual a: 20 * 16 * 5 = 1600 stream processors.

Fig. 3: Arquitetura "Cypress" (RV870) da AMD. Visão dos 20 SIMD engines cada um composto por 16 SCs (Stream Cores). Fonte: AMD.

O desempenho da RV870 é dependente da velocidade de operação de suas ALUs da mesma forma que a Fermi: para a Radeon HD5870, essa velocidade é igual a 850 MHz. Assim, o poder computacional dessa placa pode ser calculado da mesma forma que para a Fermi: 1600 * 0,850 * 2 = 2720 GFlops. Para a precisão dupla, a RV870 funciona de maneira diferente da Fermi: a ALU reservada para as funções especiais (retângulo maior) não participa dos cálculos em precisão dupla e as 4 ALUs restantes combinadas são capazes de realizar apenas 2 operações de ponto-flutuante em precisão dupla (FMAD) por ciclo de clock. Isso equivale dizer que o número de unidades para processamento em precisão dupla é igual ao número de “Stream Cores”: 20 * 16 = 320 “cores”. Com essas informações, o desempenho da HD5870 em precisão dupla é igual a: 320 * 0.850 * 2 = 544 GFlops.

Fig. 4: Visão detalhada de um Stream Core. Composto por 5 PE (Processing Elements). Fonte: AMD.

É interessante observar que embora a HD5870 tenha mais unidades de cálculo que a GTX 480, elas funcionam a uma freqüência de clock menor, o que faz com que a diferença em desempenho não seja proporcional apenas ao número dessas ALUs, em precisão simples. Já em precisão dupla, essa diferença é ainda menor devido ao modo como essas unidades de cálculo operam com esses dados. Deve-se ter em mente que essa comparação serve apenas como uma primeira abordagem de avaliação de desempenho, pois ela não leva em conta, por exemplo, o desempenho das arquiteturas para o cálculo de funções transcedentais (seno, cosseno, etc) e nem a capacidade de cada uma em operar com texturas. Características que podem ser importantes para alguns tipos de programas.

Qualquer sugestão ou comentário será bem vindo.

Fontes:

[1] Fermi Compute Architecture White Paper.

[2] GPU Computing: Past, Present and Future with ATI Stream Technology.

[3] Heterogeneous Computing: OpenCL and the ATI Radeon HD5870 (“Evergreen”) Architecture.

Sobre HIdagawa
CUDA, GPGPU, HPC

2 Respostas para NVIDIA e AMD: Uma breve comparação de arquiteturas

  1. Liana disse:

    Os nossos engenheiros ja fizeram varios testes c/ Fermi c/ CULA (linear algebra routines accelerated on CUDA), um deles:

    http://www.culatools.com/blog/2010/04/16/11-initial-fermi-performance

  2. Bruno disse:

    Só as Tesla com arquitetura Fermi podem combinar 2 unidades de ponto flutuante pra fazer uma operação de precisão dupla. Nas geforce precisão dupla continua sendo 1/8 da velocidade de precisão simples.

    http://forums.nvidia.com/index.php?showtopic=165055

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Gravatar
WordPress.com Logo

Please log in to WordPress.com to post a comment to your blog.

Imagem do Twitter

You are commenting using your Twitter account. Sair / Alterar )

Foto do Facebook

You are commenting using your Facebook account. Sair / Alterar )

Connecting to %s

Seguir

Obtenha todo post novo entregue na sua caixa de entrada.