Pergunta

Estou apenas aprendendo OpenCL, e estou no ponto em que tento iniciar um kernel.Por que os threads da GPU são gerenciados em uma grade?

Vou ler mais sobre isso em detalhes, mas seria bom com uma explicação simples.É sempre assim quando se trabalha com GPGPUs?

Foi útil?

Solução

Esta é uma abordagem comum, usada em CUDA, OpenCL e acho que ATI stream.

A ideia por trás da grade é fornecer um mapeamento simples, mas flexível, entre os dados que estão sendo processados ​​e os threads que fazem o processamento dos dados.Na versão simples do modelo de execução GPGPU, um thread de GPU é “alocado” para cada elemento de saída em uma grade de dados 1D, 2D ou 3D.Para processar este elemento de saída, o thread lerá um (ou mais) elementos do local correspondente ou locais adjacentes na(s) grade(s) de dados de entrada.Ao organizar os threads em uma grade, é mais fácil para os threads descobrir quais elementos de dados de entrada ler e onde armazenar os elementos de dados de saída.

Isso contrasta com o modelo comum de threading de CPU multinúcleo, onde um thread é alocado por núcleo de CPU e cada thread processa muitos elementos de entrada e saída (por exemplo,1/4 dos dados em um sistema quad-core).

Outras dicas

A resposta simples é que as GPUs são projetadas para processar imagens e texturas que são grades 2D de pixels. Quando você renderiza um triângulo no DirectX ou OpenGL, o hardware rastera -o em uma grade de pixels.

Invocarei a analogia clássica de colocar uma cavilha quadrada num buraco redondo.Bem, neste caso a GPU é um buraco muito quadrado e não tão arredondado quanto o GP (uso geral) sugeriria.

As explicações acima apresentam ideias de texturas 2D, etc.A arquitetura da GPU é tal que todo o processamento é feito em streams com o pipeline sendo idêntico em cada stream, portanto os dados que estão sendo processados ​​precisam ser segmentados dessa forma.

Uma das razões pelas quais essa é uma boa API é que normalmente você está trabalhando com um algoritmo que possui vários loops aninhados. Se você tiver um, dois ou três loops, uma grade de uma, duas ou três dimensões mapeia muito bem o problema, fornecendo um tópico para o valor de cada índice.

Portanto, os valores que você precisa no seu kernel (valores do índice) são naturalmente expressos na API.

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