문제

CUDA 애플리케이션을 작성할 때 이 이미지에 표시된 대로 드라이버 수준이나 런타임 수준에서 작업할 수 있습니다(라이브러리는 고급 수학을 위한 CUFFT 및 CUBLAS입니다).

CUDA layer model
(원천: tomshw.it)

나는 둘 사이의 절충안이 낮은 수준의 API에 대한 성능을 향상시키지만 코드 복잡성이 증가한다는 점을 가정합니다.구체적인 차이점은 무엇이며 고급 API로 수행할 수 없는 중요한 작업이 있습니까?

C#과의 상호 운용성을 위해 CUDA.net을 사용하고 있으며 드라이버 API의 복사본으로 빌드되었습니다.이는 C#으로 다소 복잡한 코드를 많이 작성하는 것을 권장하는 반면, C++에서는 런타임 API를 사용하면 더 간단해집니다.이렇게 하면 이길 수 있는 게 있을까?제가 볼 수 있는 한 가지 이점은 지능형 오류 처리를 나머지 C# 코드와 통합하는 것이 더 쉽다는 것입니다.

도움이 되었습니까?

해결책

CUDA 런타임을 사용하면 CUDA 커널을 컴파일하고 실행 파일로 연결할 수 있습니다.즉, 애플리케이션과 함께 cubin 파일을 배포하거나 드라이버 API를 통해 로드하는 작업을 처리할 필요가 없습니다.언급했듯이 일반적으로 사용하기가 더 쉽습니다.

대조적으로, 드라이버 API는 프로그래밍하기가 더 어렵지만 CUDA 사용 방법에 대한 더 많은 제어를 제공합니다.초기화, 모듈 로딩 등을 프로그래머가 직접 처리해야 합니다.

분명히 더 자세한 장치 정보는 런타임 API를 통하는 것보다 드라이버 API를 통해 쿼리할 수 있습니다.예를 들어 장치에서 사용 가능한 여유 메모리는 드라이버 API를 통해서만 쿼리할 수 있습니다.

CUDA 프로그래머 가이드에서:

이는 두 가지 API로 구성됩니다.

  • CUDA 드라이버 API라고 불리는 저수준 API,
  • CUDA 드라이버 API 위에 구현되는 Cuda Runtime API라는 고급 API.

다음 API는 상호 배타적입니다.응용 프로그램은 하나 또는 다른 응용 프로그램을 사용해야합니다.

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

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

API 간에는 눈에 띄는 성능 차이가 없습니다.커널이 메모리를 사용하는 방식과 GPU에 배치되는 방식(워프 및 블록)에 따라 훨씬 더 뚜렷한 효과가 나타납니다.

다른 팁

다중 스레드 애플리케이션에 라이브러리를 배포하기 위해서는 Driver API가 제공하는 CUDA 컨텍스트에 대한 제어가 중요하다는 것을 발견했습니다. 대부분의 고객은 GPU 가속도를 기존 응용 프로그램에 통합하려고하며 요즘 거의 모든 응용 프로그램이 다중 스레드입니다. 모든 GPU 코드가 동일한 스레드에서 초기화, 실행 및 거래 될 것이라고 보장 할 수 없었기 때문에 드라이버 API를 사용해야했습니다.

런타임 API에서 다양한 워크 어라운드를 사용한 초기 시도로 인해 때로는 장엄한 방식으로 실패로 이어졌습니다. 다른 스레드에서 잘못된 CUDA 호출 세트를 수행하여 반복적으로 반복적으로 기계를 재부팅 할 수 있음을 알았습니다.

우리는 드라이버 API를 통해 모든 것을 마이그레이션했기 때문에 모든 것이 잘되었습니다.

제이

주목해야 할 몇 가지 중요한 사항 :

먼저 API의 차이점은 호스트 측 코드에만 적용됩니다. 커널은 정확히 동일합니다. 호스트 측면에서 드라이버 API의 복잡성은 매우 사소합니다. 근본적인 차이점은 다음과 같습니다.

드라이버 API에서는 런타임 API와 같은 컨텍스트에서 사용할 수없는 기능에 액세스 할 수 있습니다.

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

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

인수 정렬 및 드라이버 API에는 실질적인 문제가 있습니다. 자세한 내용은 Cuda 2.2 베타 (또는 이후) 문서를 확인하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top