27 julho, 2013 0 Comentários AUTOR: elemarjr CATEGORIAS: Sem categoria Tags:,

Introdução a Tiling com C++ AMP - Parte 2 - tiled_extent

Tempo de leitura: 1 minuto

Olá. Tudo certo?!

No post anterior, falei sobre as motivações para utilização de Tiling com C++ AMP: substituir acessos a memória global da GPU por acessos a um cache compartilhado para algumas threads.

Nesse post, mostro como funciona o agrupamento de threads, em tiles, para utilização desse cache compartilhado.

tiled_extent

O primeiro passo para entender o conceito de tiling, está na compreensão da classe tiled_extent. Essa é a classe responsável por "fragmentar" uma amostra de dados em blocos (tiles). Veja o exemplo que segue:

#include <amp.h>
#include <vector>

using namespace concurrency;

int main()
{
	std::vector<float> v(12);
	std::fill(v.begin(), v.end(), 10.0);

	array_view<float> av(12, v);
	extent<1> e = av.extent;
	tiled_extent<4> te = e.tile<4>;
}

No pequeno exemplo acima, criei um array_view comum para um vetor (veja post sobre array_view); depois, obtive um descritivo da extensão dessa view (veja post sobre extent); por fim, separei essa extent em tiles com 4 unidades de dimensão. Ou seja, são três tiles com quatro elementos cada.

Pegou a ideia? Agora vamos para um cenário um pouco mais complicado:

#include <amp.h>
#include <vector>

using namespace concurrency;

int main()
{
	std::vector<float> v(12);
	std::fill(v.begin(), v.end(), 10.0);

	extent<2> e(4, 4);
	array_view<float, 2> av(e, v);

	tiled_extent<2, 2> te = e.tile<2, 2>();
}

O que fizemos? criamos uma extent descrevendo essa matriz tendo duas dimensões, cada uma com comprimento 4.
4x4
Depois, separamos essa extensão em quatro tiles, cada uma com quatro unidades (2x2).

tiled_4x4Perceba como ocorreu a composicão de cada tile - os números em cada posição correspondem ao índice no vetor original.

O tamanho de cada dimensão de um tile deve ser um múltiplo da dimensão total da extent. Um tile pode agrupar no máximo 1024 elementos (que correspondem a threads em C++ AMP). O número de dimensões do tiled_extent deve ser igual ao número de dimensões da extent original.

Entendido?

Concluindo

Em C++ AMP, podemos agrupar threads através da criação de instâncias da classe tiled_extent. Como veremos mais adiante, as threads agrupadas compartilham de um cache de acesso rápido a dados. Mas este é um tema para os próximos posts.

Era isso.