2008-10-28 6 views
33

CUDA 응용 프로그램을 작성하는 경우, 다음 중 하나를 수행 할 수 있습니다이 이미지에 그림과 같이 드라이버 수준에서 또는 런타임 수준에서 작업 (라이브러리는 고급 수학에 대한 CUFFT 및 CUBLAS 있습니다) :CUDA 드라이버 API

CUDA layer model

저급 API의 성능이 향상되지만 코드 복잡성이 증가한다는 단점이 있습니다. 구체적인 차이점은 무엇이며 높은 수준의 API로 수행 할 수없는 중요한 사항이 있습니까?

C#을 사용하여 interop에 CUDA.net을 사용하고 있으며 드라이버 API의 복사본으로 구축되었습니다. 이것은 C#에서 다소 복잡한 코드를 작성하는 것을 촉진하지만 C++ 코드는 런타임 API를 사용하면 더 간단합니다. 이 방법으로 이길 수있는 것이 있습니까? 내가 볼 수있는 한 가지 이점은 지능적인 오류 처리를 나머지 C# 코드와 통합하는 것이 더 쉽다는 것입니다.

+4

하나의 장점은 C. –

답변

31

CUDA 런타임을 사용하면 CUDA 커널을 컴파일하고 실행 파일로 연결할 수 있습니다. 즉, 응용 프로그램과 함께 cubin 파일을 배포하거나 드라이버 API를 통해 cubin 파일을로드 할 필요가 없습니다. 앞서 언급 한 것처럼 일반적으로 사용하기가 더 쉽습니다.

대조적으로 드라이버 API는 프로그램하기가 어렵지만 CUDA 사용 방법을보다 잘 제어 할 수 있습니다. 프로그래머는 초기화, 모듈 로딩 등을 직접 처리해야합니다.

드라이버 API를 통해보다 자세한 장치 정보를 런타임 API를 통해 쿼리 할 수 ​​있습니다. 예를 들어, 장치에서 사용 가능한 여유 메모리는 드라이버 API를 통해서만 쿼리 할 수 ​​있습니다. 쿠다 프로그래머 가이드에서

는 :

그것은 두 가지의 API로 구성되어 있습니다 :

  • 낮은 수준의 API는 CUDA 드라이버 API라고는
  • 높은 수준의 API는 호출 CUDA 드라이버 API 상단에 구현 된 CUDA 런타임 API

이러한 API는 상호 배타적입니다. 응용 프로그램은 다른 하나 또는 기타를 사용해야합니다.

CUDA 런타임은 암시적인 초기화, 컨텍스트 관리 및 모듈 관리를 제공하여 장치 코드 관리를 용이하게합니다. nvcc에서 생성 한 C 호스트 코드 은 CUDA 런타임 (4.2.5 절 참조)을 기반으로하므로이 코드에 링크 된 응용 프로그램은 CUDA 런타임 API를 사용해야합니다. 반면

는 CUDA 드라이버 API는 프로그램과 디버깅하기 어렵습니다, 더 많은 코드가 필요하지만 컨트롤의 더 나은 수준을 제공하고 cubin 객체 (섹션 4.2.5 참조) 그것은 단지 거래하기 때문에 언어에 독립적 . 특히 구성 및 커널 매개 변수는 4.2.3 절에 설명 된 실행 구성 구문 대신 명시 적 함수 호출 으로 지정해야하므로 CUDA 드라이버 API를 사용하여 커널을 구성하고 시작하는 것이 더 어렵습니다. 또한 장치 에뮬레이션 (4.5.2.9 절 참조)은 CUDA 드라이버 API에서 작동하지 않습니다.

API 간에는 눈에 띄는 성능 차이가 없습니다. 커널이 메모리를 사용하는 방법과 GPU에 배치되는 방법 (워프 및 블록)은 훨씬 더 큰 효과를냅니다.

+2

의 CUDA의 일부가 인용 있다는 것을 다른 언어로 커널을 쓰기에 대한 지원을 추가 컴파일러 개발자를위한 것입니까? 그렇다면 찾을 수 없습니다. 정확한 문서 이름과 이것이 발견 된 장을 명명 할 수 있습니까? – dialer

+5

'이 API는 상호 배타적입니다 .' : 새로운 CUDA 버전에서는 더 이상 사실이 아닙니다. 이제 문서에서는 '응용 프로그램이 런타임 API 코드와 드라이버 API 코드를 혼합 할 수 있습니다.'라고 말합니다. cfr. http://stackoverflow.com/a/27014990/1938163 –

2

중요한 몇 가지 참고 사항 :

먼저 API를 사이의 차이는 호스트 측 코드에 적용됩니다. 커널은 똑같습니다. 호스트 측에서는 드라이버 api의 복잡성이 매우 간단합니다. 근본적인 차이점은 다음과 같습니다.

드라이버 api에서 런타임 API에서는 사용할 수없는 기능에 액세스 할 수 있습니다.

에뮬레이터는 런타임 API 용으로 작성된 코드에서만 작동합니다.

오, 현재 매우 유용한 라이브러리 인 cudpp는 런타임 API에서만 작동합니다.

0

인수 정렬 및 드라이버 API에는 몇 가지 실제 문제가 있습니다. 자세한 정보는 CUDA 2.2 베타 (또는 그 이상) 문서를 확인하십시오.

+1

이 사건이 여전히 오늘입니까? – einpoklum

15

나는 멀티 스레드 응용 프로그램에서 라이브러리를 배포 할 때 드라이버 API에서 제공하는 CUDA 컨텍스트에 대한 제어가 중요하다는 것을 발견했습니다. 대부분의 고객은 GPU 가속을 기존 응용 프로그램에 통합하고자하며 요즘에는 거의 모든 응용 프로그램이 멀티 스레드입니다. 모든 GPU 코드가 동일한 스레드에서 초기화되고, 실행되고, 할당이 해제된다는 것을 보장 할 수 없으므로 드라이버 API를 사용해야했습니다.

런타임 API에서 다양한 해결 방법으로 처음 시도한 모든 것이 실패로 이어졌으며 때로는 멋진 방식으로 진행되었습니다. 여러 스레드에서 잘못된 CUDA 호출 집합을 반복적으로 실행하여 컴퓨터를 즉시 재부팅 할 수있었습니다.

드라이버 API를 통해 모든 항목을 마이그레이션 했으므로 모두 정상적으로 작동합니다. 드라이버 API의

J

+1

드라이버를 직접 사용하여 이러한 다양한 작업의 타이밍을 제어하는 ​​데 도움이되는 방법을 설명하거나 더 자세히 설명하거나 어딘가에 연결할 수 있습니까? – einpoklum