Недавно я узнал, как NVCC компилирует код устройства CUDA для разных вычислительных архитектур.
С моей точки зрения, при использовании опции NVCC -gencode "arch" - это минимальная вычислительная архитектура, требуемая программным приложением, а также минимальная вычислительная архитектура устройства, которую компилятор NVCC JIT будет компилировать для кода PTX.
Я также понимаю, что параметр "code" -gencode - это вычислительная архитектура, которую NVCC полностью компилирует для приложения, так что компиляция JIT не нужна.
После проверки различных проектов Make файлов CUDA я заметил, что регулярно происходят следующие события:
-gencode arch=compute_20,code=sm_20
-gencode arch=compute_20,code=sm_21
-gencode arch=compute_21,code=sm_21
и после некоторого чтения я обнаружил, что несколько архитектур устройств могут быть скомпилированы в одном бинарном файле - в этом случае sm_20, sm_21.
Мои вопросы: почему так много пар arc/code необходимо? Используются ли все значения "арки" в приведенном выше?
в чем разница между этим и сказать:
-arch compute_20
-code sm_20
-code sm_21
Является ли самая ранняя виртуальная архитектура в полях "арка" выбрана автоматически или есть какое-то другое неясное поведение?
Есть ли другая компиляция и поведение во время выполнения, о которых я должен знать?
Я прочитал руководство, http://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html#gpu-compilation, и я все еще не понимаю, что происходит при компиляции или времени выполнения.
Приветствия,
Джеймс.