Técnicas para desenvolvimento e aceleração de códigos científicos


Prof. Edson Borin
Instituto de Computação
Universidade Estadual de Campinas
Raul Baldin
Faculdade de Engenharia Civil, Arquitetura e Urbanismo
Universidade Estadual de Campinas

Atividade Prática: Blocagem de laços

Nesta atividade, exercitaremos os conceitos de blocagem de laços.

Conceitos Básicos

Primeiramente, analisaremos o desempenho de um algoritmo de cópia de matrizes. Como discutido antes, o desempenho deste algoritmo em matrizes grandes será limitado pela largura de banda da memória.

Analisaremos então o desempenho de um algoritmo ingênuo de transposição de matrizes. Este algoritmo acessa os dados da matriz em uma ordem que não favorece o reuso dos dados na cache.

Por fim, analisaremos o desempenho de um código de transposição de matrizes otimizado com a técnica de blocagem.

Atividades

Cada atividade possui um arquivo com código fonte para executar o algoritmo, medir o tempo de execução e reportar o tempo e o desempenho do acesso à memória, em Gigabytes por segundo (GB/s). O algoritmo é executado múltiplas vezes e os tempos médio, menor e maior são reportados.

Cópia de matrizes

Ao inspecionar o código do programa, você pode observar que:

Há uma linha de código que imprime o tempo para cada execução do kernel. Esta linha está comentada no programa acima. Remova o comentário e observe os tempos de execução. A primeira execução teve um tempo maior?

Qual foi a maior vazão da memória atingida em seu computador?

Transposição de matrizes ingênua

Da mesma forma que no algoritmo de cópia de matrizes, o número de elementos lidos de uma matriz e armazenados na outra é MATRIX_N x MATRIX_N. Entretanto, por causa da ordem em que os dados são acessados e do modelo de funcionamento das caches, o processador busca o mesmo dado múltiplas vezes da memória. Ao inspecionar o código do programa, você pode observar que as únicas diferenças são:

Execute este kernel e compare o desempenho do mesmo com o desempenho da cópia de matrizes.

Qual a relação de desempenho entre este algoritmo e o algoritmo de cópia de matrizes?

Transposição de matrizes com blocagem

O código da rotina kernel() indica que a transposição é feita em blocos de BLK_FACTOR x MATRIX_N. O programa define BLK_FACTOR com 256, ou seja, os blocos são de 256xMATRIX_N elementos. Como discutido antes, o bloco tem que ser dimensionado de forma que todos os dados da linha sejam usados antes que a mesma seja removida da cache do processador para que a otimização de blocagem tenha efeito.

Qual a relação de desempenho entre este algoritmo e o algoritmo de transposição ingênua e o algoritmo de cópia de matrizes?

Verifique o desempenho do programa com diferentes tamanhos de bloco.
Dica: utilize o argumento -DBLK_FACTOR=800 durante a compilação para mudar o valor da definição BLK_FACTOR sem modificar o código.

gcc -O3 -DBLK_FACTOR=800 kernel3-transpose_blocking.c -o kernel3-transpose_blocking.x

Como computar o tamanho ideal do bloco?

Desafio

O desafio consiste em realizar a blocagem da multiplicação de matrizes. Sugestões:

Qual é a relação de desempenho entre cada uma das abordagens?