09.05.2015 Views

universidade feevale douglas neves spindler algoritmos para ...

universidade feevale douglas neves spindler algoritmos para ...

universidade feevale douglas neves spindler algoritmos para ...

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

48<br />

Conforme já citado, os kernels são rotinas que são executadas <strong>para</strong>lelamente por<br />

diversas threads nos núcleos da GPU. A definição de um kernel é feita simplesmente com a<br />

adição da palavra-chave __global__ antes do nome da rotina. Além desta, duas outras<br />

palavras-chave são utilizadas em CUDA C de modo a definir onde uma rotina deve ser<br />

executada. Um resumo destas palavras-chave é exibido no quadro abaixo:<br />

Palavra-chave Executada no Chamada apenas pelo<br />

__global__ Dispositivo Host<br />

__device__ Dispositivo Dispositivo<br />

__host__ Host Host<br />

Quadro 3 – Palavras-chave <strong>para</strong> definição de um kernel.<br />

Fonte: Adaptado de Kirk e Hwu (2010, p. 52).<br />

Visto que todas as threads de um kernel executam a mesma porção de código, faz-se<br />

necessário um modo de distingui-las, de modo que cada uma acesse e processe as porções de<br />

dados às quais cada uma está destinada. Para tanto, CUDA provê variáveis que identificam os<br />

índices e das threads e blocos. Esta identificação é feita usando as variáveis blockIdx (<strong>para</strong> o<br />

índice do bloco) e threadIdx (<strong>para</strong> o índice da thread). Além disso, são disponibilizadas as<br />

variáveis gridDim e blockDim com os valores da dimensão da grade e de cada bloco,<br />

respectivamente (KIRK E HWU, 2010).<br />

Ainda conforme os autores (2010), ao iniciar-se um kernel deve-se informar os<br />

parâmetros referentes à configuração de execução deste. O primeiro parâmetro se refere à<br />

dimensão da grade em termos de número de blocos, enquanto o segundo parâmetro informa as<br />

dimensões de cada bloco em termos de número de threads. Cada um destes parâmetros é do<br />

tipo dim3, o qual é uma estrutura composta por três campos do tipo inteiro sem sinal: x, y e z.<br />

Visto que grades possuem uma estrutura bidimensional, o terceiro parâmetro é ignorado ao se<br />

especificar o tamanho da mesma.<br />

A figura a seguir ilustra um exemplo de configuração de um kernel, composto por<br />

uma grade de 4 blocos e cada bloco contendo 16 threads:<br />

Figura 17 – Exemplo de chamada de um kernel.<br />

Fonte: Kirk e Hwu (2010 p. 62).

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!