Arquitetura de dispositivo unificado de computação
Arquitetura de dispositivo unificado de computação
CUDA (inicialmente a sigla para Compute Unified Device Architecture ) é uma tecnologia de GPGPU ( General-Purpose Computing on Graphics Processing Units ), ou seja, usa um processador gráfico (GPU) para realizar cálculos gerais em vez do núcleo do processador (CPU). Na verdade, esses processadores comumente compreendem da ordem de mil circuitos de computação normalmente operando a 1 GHz , o que representa um potencial muito maior do que um processador central a 4 GHz , mesmo que seja multicore e multi-threaded , se e somente se o cálculo a ser realizada é paralelizável .
CUDA permite programar GPU C . Ele é desenvolvido pela Nvidia , inicialmente para suas placas de vídeo GeForce 8 Series , e usa um driver unificado usando uma técnica de streaming .
O primeiro kit de desenvolvimento para CUDA lançado em15 de fevereiro de 2007.
Formulários
Qualquer coisa que requeira computação intensiva que pode ser combinada em duas ou três dimensões, bem como o que pode ser dividido em cálculos independentes em fatores principais, como quebra de código, cálculos estruturais, simulação de fluido, algoritmos de recozimento simulado, pode ser feito em CUDA . , cálculos econométricos em matrizes muito grandes (técnicas para dividir essas matrizes em blocos permitem que o produto seja amplamente paralelizado) podem tirar proveito do CUDA. A quebra de senha não é exceção.
Arquiteturas reconhecidas por CUDA
Arquitetura Tesla
A arquitetura Tesla , que segundo a NVidia oferece o poder de computação de um supercomputador (4 teraflops em precisão simples, 80 gigaflops em precisão dupla) por um valor de 10.000 dólares, é construída em CUDA.
Arquitetura Pascal
A arquitetura Pascal , introduzida em 2016 com as placas GTX1080 e GTX1070 com 2560 núcleos (gravação de 16nm) e que usa GDDR5X com overclock a 2,1 GHz, também pode ser usada com CUDA. NVidia anuncia 11 teraflops em precisão simples.
Arquitetura Fermi (obsoleta)
A arquitetura Fermi , introduzida em 2010 com o GF100, agora está obsoleta, com versões CUDA posteriores a 8.0.x sem suporte.
Programação
CUDA tem várias particularidades em relação à programação C, oferecendo a realização de cálculos genéricos em GPUs:
- Hierarquização explícita das áreas de memória (privada, local, global) permitindo organizar com precisão as transferências entre elas.
- Agrupamento de threads em grades de grades: grade de threads 1D, 2D ou 3D local que pode compartilhar rapidamente a memória local. As grades locais são ordenadas em uma grade global permitindo acesso à memória global.
Algumas realizações combinam o uso da linguagem Go , muito orientada para a programação de processos concorrentes e o gerenciamento de memória sem vazamentos, com a do CUDA.
Benefícios
- Acesso relativamente padronizado ao poder de computação.
- Um programa feito com CUDA ainda pode ser usado em mais de uma geração de hardware.
Limites
- As velocidades de transferência entre o host e o cliente podem ser um gargalo; pode ser evitado por cópias assíncronas.
- Agrupamento de threads em grupos de trinta e dois, por motivos de desempenho ( warps ). Discrepâncias dentro de um warp , devido a execuções condicionais, podem afetar muito o desempenho. Esta é uma limitação devido ao modelo SIMD. Portanto, nem todos os algoritmos se beneficiam de serem portados para CUDA e, mais geralmente, para um modelo SIMD.
- O código C válido pode ser rejeitado devido a restrições de hardware, como pouca memória ou o número de threads .
- As primeiras versões (1.x) do CUDA não suportavam recursão , ponteiros de função e outras limitações que tendem a desaparecer.
- A precisão dos cálculos: a dupla precisão só está disponível a partir da versão 1.3. Além disso, o padrão IEEE 754 é alcançado apenas parcialmente: na precisão dupla, o único modo de arredondamento é arredondado para o par mais próximo . Na precisão simples, os números não são desnormalizados, o sinal NaN está ausente e os únicos dois modos de arredondamento são divisão e arredondamento para o par mais próximo .
Exemplos
Exemplo com emulação de cartão
#include <stdio.h>
#include <stdlib.h>
#include <cuda.h>
#include <cuda_runtime.h>
__global__
void mykernel(float *A1, float *A2, float *R)
{
int p = threadIdx.x;
R[p] = A1[p] + A2[p];
}
int main()
{
float A1[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
float A2[] = { 10, 20, 30, 40, 50, 60, 70, 80, 90 };
float R[9];
// 9 additions, aucune boucle !
mykernel<<<1 ,9>>>(A1, A2, R);
// sortie à l'ecran
for (int i = 0; i < 9; i++) {
printf("%f\n", R[i]);
}
}
Este exemplo só funciona se emularmos a placa gráfica porque não copiamos os dados na placa.
Compilado por:
nvcc -deviceemu -o run prog.cu
Exemplo com uma placa gráfica NVidia
#include <stdio.h>
#include <stdlib.h>
#include <cuda.h>
#include <cuda_runtime.h>
__global__
void mykernel(float *A1, float *A2, float *R)
{
int p = threadIdx.x;
R[p] = A1[p] + A2[p];
}
int main()
{
float A1[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
float A2[] = { 10, 20, 30, 40, 50, 60, 70, 80, 90 };
float R[9];
int taille_mem = sizeof(float) * 9;
// on alloue de la memoire sur la carte graphique
float *a1_device;
float *a2_device;
float *r_device;
cudaMalloc((void**) &a1_device, taille_mem);
cudaMalloc((void**) &a2_device, taille_mem);
cudaMalloc((void**) &r_device, taille_mem);
// on copie les donnees sur la carte
cudaMemcpy(a1_device, A1, taille_mem, cudaMemcpyHostToDevice);
cudaMemcpy(a2_device, A2, taille_mem, cudaMemcpyHostToDevice);
//9 additions, aucune boucle !
mykernel<<<1, 9>>>(a1_device, a2_device, r_device);
// on recupere le resultat
cudaMemcpy(R, r_device, taille_mem, cudaMemcpyDeviceToHost);
// sortie à l'ecran
for(int i = 0; i < 9; i++) {
printf("%f\n", R[i]);
}
}
Compilado por:
nvcc -o add_cuda add_cuda.cu
Notas e referências
-
" https://docs.nvidia.com/cuda/ "
-
" https://developer.nvidia.com/cuda-toolkit-archive "
-
(em) Anand Lal Shimpi e Wilson, Derek, " GPUs Nvidia's GeForce 8800 (G80) Re-arquitetadas para DirectX 10 " , AnandTech,8 de novembro de 2006(acessado em 16 de maio de 2015 ) .
-
(in) " http://news.developer.nvidia.com/2007/02/cuda_for_gpu_co.html " ( Arquivo • Wikiwix • Archive.is • Google • O que fazer? ) , Na Nvidia .
-
" Cryptohaze " , no SourceForge (acessado em 13 de agosto de 2020 ) .
-
https://hpcugent.github.io/easybuild/files/FOSDEM14/FOSDEM14_HPC_devroom_14_GoCUDA.pdf
Veja também
Artigos relacionados
Produtos concorrentes
links externos
Instalação de CUDA de acordo com os sistemas operacionais
Arquitetura CUDA