¿Cuál es el propósito de usar múltiples banderas de "arco" en el compilador NVCC de Nvidia?

Recientemente me he enterado de cómo NVCC compila el código del dispositivo CUDA para diferentes arquitecturas de cómputo.

Según mi entender, cuando se usa la opción de código de NVCC, "arch" es la arquitectura de proceso mínima requerida por la aplicación del programador, y también la arquitectura de proceso de dispositivo mínima para la cual el compilador JIT de NVCC compilará el código PTX.

También entiendo que el parámetro "código" de -gencode es la arquitectura de cómputo para la cual NVCC compila completamente la aplicación, de modo que no es necesaria la compilación JIT.

Después de la inspección de varios Makefiles del proyecto CUDA, noté que lo siguiente ocurre regularmente:

-gencode arch=compute_20,code=sm_20
-gencode arch=compute_20,code=sm_21
-gencode arch=compute_21,code=sm_21

y después de algunas lecturas, encontré que se podían compilar múltiples arquitecturas de dispositivos en un solo archivo binario, en este caso sm_20, sm_21.

Mis preguntas son ¿por qué son necesarios tantos pares de arco / código? ¿Se utilizan todos los valores de "arco" en lo anterior?

¿Cuál es la diferencia entre eso y decir:

-arch compute_20
-code sm_20
-code sm_21

¿Se selecciona automáticamente la arquitectura virtual más antigua en los campos de "arco", o hay algún otro comportamiento oscuro?

¿Hay algún otro comportamiento de compilación y tiempo de ejecución que deba tener en cuenta?

He leído el manual,http://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html#gpu-compilation y todavía no tengo claro lo que sucede en la compilación o el tiempo de ejecución.

Respuestas a la pregunta(2)

Su respuesta a la pregunta