El primer punto a hacer sobre PTX es que es sólo un intermedio representación del código ejecutarse en la GPU - un lenguaje de montaje de la máquina virtual. PTX se ensambla al código de máquina de destino ya sea por ptxas
en tiempo de compilación o por el controlador en tiempo de ejecución. Entonces, cuando mira PTX, está viendo lo que emitió el compilador, pero no lo que realmente ejecutará la GPU. También es posible escribir su propio código PTX, ya sea desde cero (este es el único modelo de compilación JIT admitido en CUDA), o como parte de secciones de ensamblador en línea en código CUDA C (este último oficialmente soportado desde CUDA 4.0, pero " extraoficialmente "apoyado por mucho más tiempo que eso". CUDA siempre ha enviado una guía completa del lenguaje PTX con el kit de herramientas, y está completamente documentado. El ocelot project ha utilizado esta documentación para implementar su propio compilador cruzado PTX, que permite que el código CUDA se ejecute de forma nativa en otro hardware, inicialmente procesadores x86, pero más recientemente GPU AMD.
Si quiere ver qué es la GPU actualmente en ejecución (opuesta a lo que está emitiendo el compilador), NVIDIA ahora proporciona una herramienta de desensamblador binario llamada cudaobjdump
que puede mostrar los segmentos reales de código de máquina compilados para las GPU de Fermi. Había una herramienta más antigua y no oficial llamada decuda
que funcionaba para las GPU G80 y G90.
Habiendo dicho eso, hay mucho que aprender de la salida de PTX, particularmente sobre cómo el compilador está aplicando optimizaciones y qué instrucciones está emitiendo para implementar ciertas contrucciones de C. Cada versión del juego de herramientas NVIDIA CUDA viene con a guide to nvcc
y documentation for the PTX language. Hay una gran cantidad de información contenida en ambos documentos para aprender cómo compilar un código del kernel CUDA C/C++ para PTX, y para entender qué harán las instrucciones PTX.
Puede desmontar el código binario. Debería mirar la IMO, para evitar caer en el tipo de trampas "creo que optimizaría" y poder ver lo que realmente está haciendo cuando está optimizando un kernel. – harold