2011-09-08 19 views
13

Pregunto esto porque sé que hay una forma de usar archivos binarios en lugar de archivos fuente.¿Hay un lenguaje ensamblador para CUDA?

Además, supongo que con un lenguaje ensamblador, sería más fácil simular punteros a funciones. A menos que el ensamblaje en una GPU sea totalmente diferente al de una CPU.

+0

¿Qué pasa con C para CUDA? http://developer.download.nvidia.com/compute/cuda/2_1/toolkit/docs/NVIDIA_CUDA_Programming_Guide_2.1.pdf –

+4

Respondido hace unas semanas [en una respuesta a "¿Es posible poner instrucciones en el código CUDA?" ] (http://stackoverflow.com/questions/3677220/is-it-possible-to-put-instructions-into-cuda-code/7072079#7072079). * Nota: * no es la respuesta aceptada, sino una que vino después. – dmckee

+0

@dmckee +1. Además, dado que los punteros de función CUDA 3.2 (y 2.0 dispositivos) son compatibles sin interferir con ptx. Y los dispositivos más antiguos simplemente no tienen tal cosa como la función del dispositivo: todas las llamadas a las funciones '__device__' del núcleo estaban en línea. – aland

Respuesta

29

Es posible que desee echarle un vistazo a PTX. NVIDIA proporciona una documento que lo describe en la documentación de CUDA 4.0.

http://developer.nvidia.com/nvidia-gpu-computing-documentation

NVIDIA describe PTX como "Ta-bajo nivel de ejecución rosca paralela máquina y la instrucción virtual conjunto arquitectura (ISA). PTX expone la GPU como un dispositivo de computación de datos en paralelo." No es exactamente como el ensamblaje x86, pero puede que le resulte interesante leerlo.

+10

Vale la pena señalar que PTX es un conjunto de instrucciones virtual. Cada arquitectura NVIDIA distintiva tiene su propia ISA física a la que apunta PTX.Uno puede alinear las instrucciones de PTX en el código de CUDA de manera similar al asm x86 en línea. –

12

Sí, el ensamblaje en una GPU es totalmente diferente al de una CPU. Una de las diferencias es que el conjunto de instrucciones para una GPU no está estandarizado. NVidia (y AMD y otros proveedores de GPU) pueden cambiar y cambian su conjunto de instrucciones de un modelo de GPU al siguiente.

Así que CUDA no expone un lenguaje ensamblador. No tendría sentido. (Y las limitaciones en el dialecto C de CUDA y cualquier otro idioma que admitan están ahí debido a limitaciones en el hardware de la GPU, no solo porque Nvidia lo odia y quiere molestarlo. Incluso si tuviera acceso directo al conjunto de instrucciones subyacente y el lenguaje ensamblador, no sería capaz de hacer cosas mágicamente que no puede hacer ahora.

(Tenga en cuenta que NVidia define un conjunto de instrucciones "virtuales" que puede usar e incrustar en su código. no el conjunto de instrucciones, y no se asigna directamente a las instrucciones de hardware. Es poco más que un lenguaje de programación simple que "se parece" a un dialecto del ensamblaje

+1

¡oh! es bueno saberlo ... si ni siquiera puedo esperar que ese código funcione en diferentes GPU ... definitivamente es el enfoque equivocado. Gracias – widgg

+0

Su código CUDA funcionará bien en diferentes GPU. CUDA simplemente lo compila a un objetivo adecuado para cada GPU. – jalf

15

De hecho, hay dos lenguajes de ensamblaje CUDA diferentes.

PTX es un lenguaje de ensamblaje independiente de la máquina que se compila en SASS, los códigos de operación reales ejecutados en una familia de GPU en particular. Si construyes .cubins, estás lidiando con SASS. La mayoría de las aplicaciones de tiempo de ejecución CUDA utilizan PTX, ya que esto les permite ejecutar en GPU lanzadas después de la aplicación original.

Además, los punteros a las funciones han estado en CUDA por un tiempo si se dirige a sm_20 (serie Fermi/GTX 400).

Cuestiones relacionadas