2013-07-11 8 views
26

최근에 NVCC가 어떻게 다른 컴퓨팅 아키텍처를위한 CUDA 장치 코드를 컴파일하는지에 대해 머리를 맞았습니다.Nvidia의 NVCC 컴파일러에서 여러 "아치"플래그를 사용하는 목적은 무엇입니까?

NVCC의 -gencode 옵션을 사용할 때 "arch"는 프로그래머 응용 프로그램에 필요한 최소 컴퓨팅 아키텍처이며 NVCC의 JIT 컴파일러가 PTX 코드를 컴파일하는 최소 장치 컴퓨팅 아키텍처입니다.

-gencode의 "code"매개 변수는 NVCC에서 응용 프로그램을 완전히 컴파일하는 계산 구조이므로 JIT 컴파일이 필요하지 않습니다.

다양한 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 

가 자동으로 선택은 "아치"필드에서 가장 오래된 가상 아키텍처, 또는 다른 모호한 행동이?

내가 알아야 할 다른 컴파일 및 런타임 동작이 있습니까?

설명서를 읽었으며 http://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html#gpu-compilation을 읽었습니다. 컴파일이나 런타임시 어떤 일이 발생하는지에 대해서는 아직 명확하지 않습니다.

건배,

제임스. SASS

가상 아키텍처 (예 compute_20-arch compute...에 의해 지정됩니다 어떤> - -> PTX

CUDA C/C++ 장치 코드 소스 :

답변

31

대략 말하기는 코드 컴파일 흐름은 다음과 같이 간다) 어떤 유형의 PTX 코드가 생성 될지 결정합니다. 추가 스위치 (예 : -code sm_21)는 생성 될 SASS 코드의 유형을 결정합니다. SASS는 실제로 GPU (기계어)에 대한 실행 가능 객체 코드입니다. 실행 파일에는 SASS 및/또는 PTX의 여러 버전이 포함될 수 있으며 실제로 사용되는 GPU를 기반으로 적절한 버전을 선택하는 런타임 로더 메커니즘이 있습니다.

GPU 작동의 편리한 기능 중 하나는 JIT 컴파일입니다. 적절한 PTX 코드를 사용할 수 있지만 적합한 SASS 코드가 없으면 GPU 드라이버가 JIT 컴파일을 수행합니다 (CUDA 툴킷을 설치할 필요가 없음).

여러 가상 아키텍처 (예 : PTX의 여러 버전)를 포함하는 장점 중 하나는 다양한 대상 GPU 장치와의 실행 호환성이 있다는 것입니다 (일부 장치는 JIT 컴파일을 실행하여 필요한 SASS를 만들 수 있음)).

다수의 "실제 GPU 타겟"(즉,여러 SASS 버전)은 해당 대상 장치 중 하나가있을 때 JIT 컴파일 단계를 피할 수 있다는 것입니다.

잘못된 옵션 집합을 지정하면 특정 GPU에서 (올바르게) 실행되지 않는 실행 파일을 만들 수 있습니다.

이러한 많은 옵션을 지정할 때 발생할 수있는 단점은 코드 크기가 커진다는 것입니다. 또 다른 단점은 컴파일 시간입니다. 일반적으로 더 많은 옵션을 지정하면 더 길어집니다.

IP를 모호하게하려는 사람들에게 관심의 대상이 될 수있는 PTX가없는 excutables를 만들 수도 있습니다.

JIT에 적합한 PTX를 만들려면 code 스위치의 경우 specifying a virtual architecture이어야합니다.

+1

늦게 답장을 보내 주셔서 감사합니다. 필자는 PTX to JIT를 많은 실제 아키텍처 용으로 컴파일하는 것을 이해하지만, 구형 PTX 아키텍처를 모두 포함 시키거나 최소 사양 PTX 만 포함시켜야합니까? 예를 들어 가능한 한 많은 GPU에서 코드를 실행하려면 -arch compute_11, 12 13 ... 30, 35를 포함 시키거나 -arch compute_11을 포함 시키면됩니까? 최고, 제임스. –

+3

'-arch compute_11' 만 지정하면 cc 1.1 PTX 코드가 생성됩니다. 현재와 ​​미래의 모든 GPU는이 PTX 버전에서 몇 가지 유용한 머신 코드 (cc 1.0 장치 제외)로 JIT 컴파일 할 수 있어야합니다. 그러나 추가 PTX 버전을 지정하면 "새로운"PTX를 추가하여 새로운 아키텍처를 더 잘 활용할 수있는 기회를 제공 할 수 있습니다. 예를 들어 cc3.0 장치에서 코드가 더 빠르게 실행될 수 있습니다. 'compute_30'도 지정되었습니다. 그것은 코드 크기/컴파일 시간과 최상의 퍼포먼스 사이의 절충점입니다. 귀하의 마일리지가 다를 수 있습니다. –

+0

모두 지금 분명하고 훌륭한 답변입니다. 시간 내 줘서 고마워! –