test run instalar how cuda nvcc ptx fat-binaries

cuda - run - nvcc windows



CUDA: Cómo usar-arch y-code y SM vs COMPUTE (1)

Algunas preguntas / respuestas relacionadas están here y here .

Todavía no estoy seguro de cómo especificar correctamente las arquitecturas para la generación de código al compilar con nvcc.

Una descripción completa es algo complicada, pero se pretende que sean usos canónicos relativamente simples y fáciles de recordar. Compile para la arquitectura (tanto virtual como real), que representa las GPU que desea orientar. Una forma bastante simple es:

-gencode arch=compute_XX,code=sm_XX

donde XX es la capacidad de cálculo de dos dígitos para la GPU a la que desea dirigirse. Si desea apuntar a múltiples GPU, simplemente repita la secuencia completa para cada XX objetivo. Este es aproximadamente el enfoque adoptado con los proyectos de código de ejemplo de CUDA. (Si desea incluir PTX en su ejecutable, incluya un -gencode adicional con la opción de code especifique la misma arquitectura virtual de PTX que la opción de arch ).

Otra forma bastante simple, cuando se dirige a una sola GPU, es usar:

-arch=sm_XX

Con la misma descripción para XX. Este formulario incluirá SASS y PTX para la arquitectura especificada.

Ahora, de acuerdo con esto, aparte de los dos indicadores del compilador, también hay dos formas de especificar arquitecturas: sm_XX y compute_XX, donde compute_XX se refiere a virtual y sm_XX a una arquitectura real. La bandera -arch solo toma identificadores para arquitecturas virtuales (como compute_XX) mientras que la bandera -code toma ambos, identificadores para arquitecturas reales y virtuales.

Básicamente, esto es correcto cuando el arch y el code se usan como sub-conmutadores dentro del conmutador -gencode , o si ambos se usan juntos , de forma independiente, como lo describe. Pero, por ejemplo, cuando se usa -arch por sí mismo (sin -code ), representa otro tipo de notación "abreviada", y en ese caso, puede pasar una arquitectura real, por ejemplo -arch=sm_52

Sin embargo, no está claro qué código PTX o binario se integrará en el binario. Si especifico, por ejemplo, -arch = compute_30 -code = sm_52, ¿significa eso que mi código se compilará primero en el nivel de función 3.0 PTX a partir del cual luego se creará el código de máquina para el nivel de función 5.2? ¿Y qué se incrustará?

La definición exacta de lo que se incrusta varía según la forma de uso. Pero para este ejemplo:

-gencode arch=compute_30,code=sm_52

o para el caso equivalente que identifiques:

-arch=compute_30 -code=sm_52

entonces sí, significa que:

  1. Se generará un código PTX temporal a partir de su código fuente, y utilizará cc3.0 PTX.
  2. A partir de ese PTX, la herramienta ptxas generará un código SASS compatible con cc5.2.
  3. El código SASS se integrará en su ejecutable.
  4. El código PTX será descartado.

(No estoy seguro de por qué especificaría realmente un combo de este tipo, pero es legal).

Si acabo de especificar -code = sm_52, ¿qué pasará entonces? ¿Solo se incorporará el código de máquina para V5.2 que se ha creado a partir del código PTX V5.2? ¿Y cuál sería la diferencia a -code = compute_52?

-code=sm_52 generará un código SASS cc5.2 a partir de un código PTX intermedio. El código SASS será incrustado, el PTX será descartado. Tenga en cuenta que especificar esta opción por sí mismo de esta forma, sin la opción -arch , sería ilegal. (1)

-code=compute_52 generará cc5.x código PTX (solo) e incrustará ese PTX en el ejecutable / binario. Tenga en cuenta que especificar esta opción por sí mismo de esta forma, sin la opción -arch , sería ilegal. (1)

La tool cuobjdump se puede usar para identificar qué componentes están exactamente en un binario determinado.

(1) Cuando no se usa ningún -arch , y no se -arch ningún conmutador -arch , nvcc asume que se nvcc un -arch=sm_20 predeterminado a su comando de compilación (esto es para CUDA 7.5, la configuración predeterminada de -arch puede variar según la versión de CUDA ). sm_20 es una arquitectura real , y no es legal especificar una arquitectura real en la opción -arch cuando también se proporciona una opción -arch .

Todavía no estoy seguro de cómo especificar correctamente las arquitecturas para la generación de código al compilar con nvcc. Soy consciente de que hay un código de máquina así como un código PTX incorporado en mi binario y que esto puede controlarse mediante los interruptores del controlador -arch y -arch (o una combinación de ambos usando -gencode ).

Ahora, de acuerdo con this aparte de los dos indicadores del compilador, también hay dos formas de especificar arquitecturas: sm_XX y compute_XX , donde compute_XX refiere a virtual y sm_XX a una arquitectura real. La bandera -arch solo toma identificadores para arquitecturas virtuales (como compute_XX ) mientras que la bandera -code toma ambos, identificadores para arquitecturas reales y virtuales.

La documentación indica que -arch especifica las arquitecturas virtuales para las que se compilan los archivos de entrada. Sin embargo, este código PTX no se compila automáticamente en código de máquina, sino que es más bien un "paso de preprocesamiento".

Ahora, se supone que -code especifica para qué arquitecturas se ensambla y optimiza el código PTX.

Sin embargo, no está claro qué código PTX o binario se integrará en el binario. Si especifico, por ejemplo, -arch=compute_30 -code=sm_52 , ¿significa que mi código se compilará primero en el nivel de función 3.0 PTX a partir del cual luego se creará el código de máquina para el nivel de función 5.2? ¿Y qué se incrustará?

Si acabo de especificar -code=sm_52 ¿qué pasará entonces? ¿Solo se incorporará el código de máquina para V5.2 que se ha creado a partir del código PTX V5.2? ¿Y cuál sería la diferencia a -code=compute_52 ?