Jaki jest cel używania wielu flag „arch” w kompilatorze NVCC Nvidii?

Ostatnio skupiłem się na tym, jak NVCC kompiluje kod urządzenia CUDA dla różnych architektur obliczeniowych.

Z mojego zrozumienia wynika, że ​​przy użyciu opcji -gencode NVCC „arch” jest minimalną architekturą obliczeniową wymaganą przez aplikację programisty, a także minimalną architekturą obliczeniową urządzenia, którą kompilator JIT NVCC skompiluje kod PTX.

Rozumiem również, że parametr „code” w -gencode jest architekturą obliczeniową, dla której NVCC całkowicie kompiluje aplikację, tak że nie jest konieczna kompilacja JIT.

Po sprawdzeniu różnych plików MakeFile projektu CUDA zauważyłem, że regularnie pojawiają się następujące rzeczy:

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

i po pewnym przeczytaniu odkryłem, że wiele architektur urządzeń można skompilować w jednym pliku binarnym - w tym przypadku sm_20, sm_21.

Moje pytania brzmią: dlaczego tak wiele par łuków / kodu jest potrzebnych? Czy w powyższym kodzie są używane wszystkie wartości „łuku”?

jaka jest różnica między tym a powiedzeniem:

-arch compute_20
-code sm_20
-code sm_21

Czy najwcześniejsza wirtualna architektura w polach „łukowych” jest wybierana automatycznie, czy jest jakieś inne niejasne zachowanie?

Czy jest jakaś inna kompilacja i zachowanie podczas wykonywania, o którym powinienem wiedzieć?

Przeczytałem instrukcję,http://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html#gpu-compilation i nadal nie jestem pewien, co dzieje się w kompilacji lub czasie wykonywania.

questionAnswers(2)

yourAnswerToTheQuestion