Con todo lo expuesto en los
post anteriores debemos confeccionar nuestra lista de prioridades a la
hora de diseñar los kernel que ejecuten las GPU. Resumiendo, debemos tener en
cuenta los siguientes factores:
·
Factor de “unroll”
·
ILP: Nivel de Paralelización por instrucción
·
Factor de ocupación de la GPU, que se compone de:
o
Nº de bloques que se necesitan
o
Nº de hilos por cada bloque
o
Registros utilizados en el kernel
·
Transferencias de memoria CPU <-> GPU
·
Tipos de memoria a utilizar, Global, compartida,…
Teniendo todo esto en cuenta, nuestro kernel debe tener un número de
instrucciones mínimo que ocupe la
latencia de la arquitectura, y se intentará invocar al kernel con el tamaño justo de bloques e hilos por bloques que
maximicen la ocupación del tamaño
requerido. Se minimizará el número de
transferencias de memoria entre CPU y GPU. Se intentará evitar las latencias de acceso a memoria
global mediante accesos ordenados en memoria compartida.
En el próximo post, ilustraré con un ejemplo todo esto que hemos comentado
No hay comentarios:
Publicar un comentario