최근에 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++ 장치 코드 소스 :
늦게 답장을 보내 주셔서 감사합니다. 필자는 PTX to JIT를 많은 실제 아키텍처 용으로 컴파일하는 것을 이해하지만, 구형 PTX 아키텍처를 모두 포함 시키거나 최소 사양 PTX 만 포함시켜야합니까? 예를 들어 가능한 한 많은 GPU에서 코드를 실행하려면 -arch compute_11, 12 13 ... 30, 35를 포함 시키거나 -arch compute_11을 포함 시키면됩니까? 최고, 제임스. –
'-arch compute_11' 만 지정하면 cc 1.1 PTX 코드가 생성됩니다. 현재와 미래의 모든 GPU는이 PTX 버전에서 몇 가지 유용한 머신 코드 (cc 1.0 장치 제외)로 JIT 컴파일 할 수 있어야합니다. 그러나 추가 PTX 버전을 지정하면 "새로운"PTX를 추가하여 새로운 아키텍처를 더 잘 활용할 수있는 기회를 제공 할 수 있습니다. 예를 들어 cc3.0 장치에서 코드가 더 빠르게 실행될 수 있습니다. 'compute_30'도 지정되었습니다. 그것은 코드 크기/컴파일 시간과 최상의 퍼포먼스 사이의 절충점입니다. 귀하의 마일리지가 다를 수 있습니다. –
모두 지금 분명하고 훌륭한 답변입니다. 시간 내 줘서 고마워! –