Testeos y métricas
Aquí aprenderemos a medir tiempos y extraer las propiedades hardware más interesantes de la GPU con la que vamos a interactuar: Número de cores y sus frecuencias, memorias y sus anchos de banda, ...
Para cumplir con nuestro cometido, necesitamos acudir a los siguientes códigos del SDK de CUDA:
- DeviceQuery: Extrae las magnitudes más interesantes de la GPU seleccionada.
- Bandwidthtest: Mide los anchos de banda en las transferencias CPU-GPU, GPU-GPU y GPU-CPU.
- Clock: Nos enseña la forma más eficiente y fiable de medir los tiempos de ejecución del código.
Los códigos que se utilizarán para ese ejercicio provienen del SDK que Nvidia proporciona junto al compilador. Se encuentran en el directorio NVIDIA_GPU_Computing_SDK/C/src/ dentro de tu cuenta de usuario.
deviceQuery
Es interesante conocer las características básicas de las GPUs con las que estamos trabajando. Para ello, compila y ejecuta el test DeviceQuery, y observa todas las características de las GPUs con las que trabajaremos. Intenta relacionar cada una de sus propiedades con las particularidades de la arquitectura CUDA que hemos visto en teoría. Si no sabes cómo compilar y ejecutar, visita el ejemplo básico de este tutorial que explica cómo hacerlo para cada código a partir del directorio donde se encuentra alojado.
bandwidthTest
Hemos preparado también un pequeño test para que midas el ancho de banda efectivo del bus PCI-express. Es un factor a tener muy en cuenta a la hora de realizar computación con GPUs. Lanza a ejecución el test, y observa los resultados. ¿Es simétrico el ancho de banda conseguido al enviar datos a la GPU o recibir de ella?
Prueba a ejecutar el mismo programa con la opción --memory=pinned, y verás que las transferencias son mucho más rápidas. Nvidia recomienda el uso de memoria "pinned" o "no-paginable" para aumentar la eficiencia de las transferencias. Sin embargo, impedir la paginación puede tener efectos adversos para el sistema operativo. La recomendación, pues, se reduce a utilizarla cuando sea posible, siempre que la cantidad de este tipo de memoria que reservemos no sea excesiva.
clock
Este sencillo programa ejemplifica cómo medir tiempos de ejecución en CPU y GPU, algo que también resulta muy útil a la hora de evaluar el rendimiento de nuestro código CUDA y compararlo con el que proporciona la CPU. Ejecútalo y fíjate en toda la información autodescriptiva que proporciona.