O objetivo do script espiral é criar uma imagem gerada por computador. A imagem mapeia para GPUs com suporte CUDA.
A seguir, são apresentados exemplos de imagens criadas com o script python. Seus detalhes de configuração podem ser encontrados na pasta Exemplos com outros exemplos.
Para executar o script Python, as seguintes dependências precisam ser instaladas:
Quando executado sequencialmente em um Intel i7-9700K, cada imagem leva aproximadamente 23.5877081 segundos.
O primeiro passo para otimizar o algoritmo CGI foi reconstruir o algoritmo para uso paralelo na GPU. Isso foi feito usando o Decorador @cuda.jit , que requer invocação do kernel. Antes de executar o algoritmo, o código determina como mapear uma matriz de pixels no hardware da GPU. No algoritmo, os loops para calcular cada pixel são substituídos por i, j = cuda.grid(2) . Se i e j estiverem dentro dos limites da imagem, a função calcula a cor do pixel do índice. Sem loops. A aceleração da paralelização é de cerca de 1.072, levando aproximadamente 22.1124 milissegundos.
De acordo com a ferramenta nvprof CLI (em otimizações.txt), [CUDA memcpy HtoD] representa aproximadamente 36.09% da execução. Para ignorar isso, a matriz Pixel pode ser criada e inicializada no dispositivo sem nunca ser adicionada na memória do lado da CPU. numba.cuda fornece um device_array de função para fazê -lo. A aceleração de minimizar a transferência de hospedeiro para dispositivo é de cerca de 1,38, levando aproximadamente 15.9563 milissegundos.
A próxima otimização utiliza memória compartilhada, memória que um bloco de threads compartilha. Como a memória é específica do bloco, as velocidades de leitura e gravação são mais rápidas. Portanto, as operações de acesso à memória podem ser calculadas na memória compartilhada. Após as operações, um acesso lento à matriz pixel global conclui a computação paralela. A aceleração do uso de memória compartilhada é de cerca de 1,068, levando aproximadamente 14.9425 milissegundos.
A aceleração total do algoritmo da CPU para o algoritmo GPU otimizado é de aproximadamente 1.578.