Какова цель использования нескольких «арочных» флагов в компиляторе Nvidia NVCC?
Недавно я понял, как NVCC компилирует код устройства CUDA для различных вычислительных архитектур.
Насколько я понимаю, при использовании опции NVgen -gencode «arch» - это минимальная вычислительная архитектура, требуемая приложением программиста, а также минимальная вычислительная архитектура устройства, для которой JIT-компилятор NVCC будет компилировать PTX-код.
Я также понимаю, что параметр «code» -gencode - это вычислительная архитектура, для которой NVCC полностью компилирует приложение, так что компиляция JIT не требуется.
После проверки различных Makefiles проекта 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.
Мои вопросы: почему так много пар «арка / код» необходимо? Все ли значения "арки" используются в приведенном выше?
какая разница между этим и сказать:
-arch compute_20
-code sm_20
-code sm_21
Самая ранняя виртуальная архитектура в полях "arch" выбирается автоматически или есть какое-то другое неясное поведение?
Есть ли какие-либо другие особенности компиляции и времени выполнения, о которых мне следует знать?
Я прочитал руководство,http://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html#gpu-compilation и я до сих пор не ясно, что происходит во время компиляции или во время выполнения.