Qual é a função mais trivial que ganharia em ser calculado em uma GPU?

StackOverflow https://stackoverflow.com/questions/2443402

  •  19-09-2019
  •  | 
  •  

Pergunta

Eu estou apenas começando a aprender OpenCL. Eu estou tentando obter uma sensação de que os ganhos de desempenho que esperar quando se deslocam funções / algoritmos para a GPU.

O kernel mais básica dada na maioria dos tutoriais é um kernel que tem duas matrizes de números e resume o valor para os índices correspondentes e os adiciona a uma terceira série, assim:

__kernel void 
add(__global float *a,
    __global float *b,
    __global float *answer)
{
    int gid = get_global_id(0);
    answer[gid] = a[gid] + b[gid];
}

__kernel void
sub(__global float* n,
    __global float* answer)
{
    int gid = get_global_id(0);
    answer[gid] = n[gid] - 2;
}

__kernel void
ranksort(__global const float *a,
         __global float *answer)
{
  int gid = get_global_id(0);
  int gSize = get_global_size(0);
  int x = 0;
  for(int i = 0; i < gSize; i++){
    if(a[gid] > a[i]) x++;
  }
  answer[x] = a[gid];
}

Eu estou supondo que você nunca poderia justificar o cálculo deste na GPU, a transferência de memória seria a ponderar o tempo que seria necessário computar isso na CPU por magnitudes (eu poderia estar errado sobre isso, portanto, esta questão).

O que eu estou querendo saber é qual seria o exemplo mais trivial onde você esperaria aceleração significativa quando se utiliza um kernel OpenCL em vez da CPU?

Foi útil?

Solução

Se você tem uma suficientemente grande conjunto de matrizes que você pretende executar operações de álgebra linear em, ou que você está essencialmente realizar a mesma operação em cada elemento, eu consideraria isso como um exemplo trivial. multiplicação de matrizes, além, da FFT, convolução, etc. você vai ver um pouco de um aumento de velocidade sem fazer muito trabalho. Agora, se você quiser ver as 100x speedups então você precisa mergulhar no gerenciamento de memória e saber um pouco sobre o que está acontecendo nos bastidores.

para começar, eu recomendaria começar com pycuda uma vez que é bastante simples para começar, uma vez que proporciona um alto nível de abstração e irá permitir-lhe saltar muito rapidamente. confira este curso de computação paralela utilizando CUDA da Universidade de Illinois http: //courses.ece. illinois.edu/ece498/al/ quando você está pronto para mergulhar ainda mais.

Outras dicas

depende da definição de trivial. na minha opinião, seria produto de matriz matriz, uma vez que tem O(3)/O(2) computação à relação de memória. Algoritmos que apresentam índices semelhantes, são susceptíveis de beneficiar de ser competiu na GPU.

Enquanto o seu kernel é claramente muito trivial pode ser um exemplo útil, é completamente a memória ligada uma vez que para cada elemento que você tem duas leituras e um write, e apenas uma operação aritmética. Existem algumas instruções para calcular o endereço etc., mas todos Isso equivale a praticamente nada em comparação com o custo de acesso à memória.

Assumindo que os dados já estão na GPU, você pode se beneficiar muito elevada largura de banda do GPU para a memória mesmo para este kernel simples.

Claro, GPUs confiar em você ter tópicos suficientes para esconder a latência de memória, por isso o tamanho do grupo de trabalho local deve ser bastante grande (digamos 256 ou 512) e o tamanho do grupo de trabalho global deve ser muito grande (por exemplo, centenas de milhares ) para que isso seja eficaz, mas isso é uma espécie de ponto!

Eu sei que a questão é antiga, mas ... eu achei que os cálculos do conjunto de Mandelbrot é bastante ideal para a GPU. Você tem um vetor complexo de entrada (float2) e uma saída de escalar (int) e você terá algumas centenas de operações por vetor de entrada, em média.

Pode ser usado como um aplicativo bom exemplo, já que ...

  • tem um conjunto de dados de entrada 2-dimensional (calcula uma imagem)
  • você pode explicar frentes de onda e por 2 processamento dimensional é benéfica em alguns casos
  • demonstra tipos de dados vetoriais
  • produz uma imagem, que é rapidamente verificáveis ??por olhos humanos (depuração)
  • pode ser facilmente prolongado por: o mapeamento de cor (__constant), float4 processamento, em vez de float2 (optimização), produzindo int4 (R, G, B, A) de saída vectores (optimização). Passos para a redução (RGBA) => (RGB)
  • conhecimento de matemática necessário é aceitável (fórmula simples)

Saudações, Stefan

Depois de multiplicação de matrizes eu diria imagem convolução (como borrão, denoising etc). Confira da AMD tutorial .

O que é "mais trivial" é uma questão de opinião, mas eu diria que a computação em uma imagem do conjunto de Mandelbrot é uma aplicação direta bonita usando a GPU. Cada ponto é totalmente independente de qualquer outro ponto, para que possa iniciar um thread para cada ponto e obter tremenda aceleração. A fórmula em si que é iterado é uma função quadrática simples. Usei-o como um exemplo em um tutorial que pode ser encontrado no meu blog aqui , apenas computar os números sem sequer fazer uma imagem para torná-lo ainda mais simples. Quase todo embaraçosamente paralelo (veja a entrada Wikipedia) problema é uma boa para começar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top