오늘날의 GPU 연산 API
(threedots.ovh)## 엔비디아
시장의 개척자, 발달한 툴킷. 여전히 빠르게 발전하고 있고 특히나 고레벨(higher-level) API는 더더욱 그러함. 엔비디아가 판매하는 모든 GPU는 CUDA를 지원함.
PGI로 불렸던, 리눅스에서만 사용 가능한 HPC SDK는 OpACC, C++ 표준 병렬화 (stdpar), OpenMP (베타) 지원을 추가함.
엔비디아의 HPC SDK 라이센싱의 문제 중 하나는 다음 조항임:
**You shall strictly prohibit the further distribution of the Run-Time Files by users of an End-User Application**
사용자가 번들된 앱에서 필요로 하는 런타임 파일을 포함한 채로 앱을 재배포할 수 없기 때문에 애플리케이션을 아예 배포할 수 없을 수도 있음. 이 문제는 대부분이 사용하고 있는 CUDA SDK에는 해당되지 않음.
## AMD
AMD 하드웨어에서 주력하고 있는 GPGPU 프로그래밍은 ROCm임. AMD가 소유한 HIP 외에 공식적으로 지원되는 건 OpenMP와 OpenACC.
여기에는 몇 가지 확실한 단점이 있음:
- 리눅스 전용, 따라서 시장 상당 부분에서 선택지에 들지 못함.
- ROCm 툴체인으로 생성된 바이너리는 IR을 타겟으로 하지 않고 하드웨어에 종속적임. 새로운 세대가 나오면 바이너리를 재컴파일 해야 함.
- 릴리즈 이후 꽤 오랜 시간 동안 새 하드웨어에 대한 지원이 사실상 없음.
이런 단점은 데스크탑에서의 유용성을 사실상 없는 것으로 만들고 OpenCL만 AMD GPU 하드웨어를 위한 벤더 제공 API로 남게함.
## Intel
oneAPI는 최근 출시한 모든 인텔 GPU에서 지원되지만 고성능은 아직 없음. Intel의 Level Zero 외에 공식적으로 지원되는 API는 OpenMP와 SYLC.
oneAPI의 Level Zero는 SPIR-V를 IR로 사용하여 향후 출시하게 될 하드웨어에 seamless한 지원을 가능하게 함. 윈도우 또한 지원함.
## Khronos
여러 벤더사에서 사용할 수 있는 업계 표준을 제공함.
OpenCL 3.0으로 알려진 reset은 아직 큰 영향이 없음. SYCL과 Vulkan 연산의 결합은 좋은 개발자 경험과 함께 단일 바이너리를 여러 벤더에서 사용 가능하게 하는 더 나은 길이 될 수 있음.
실제 OpenCL 지원:
오늘날 엔비디아는 extensions을 지원하는 OpenCL 1.2를 제공함.
AMD는 쓸만한 OpenCL 1.2 구현과 함께 엄청나게 버그가 많은 OpenCL 2.x 구현을 제공함 (제대로 디버깅할 방법도 없음).
Intel은 Intel GPU를 위한 OpenCL 3.0 구현을 제공함.
OpenCL 1.2는 Apple Silicon을 포함, macOS에서도 지원하긴 하지만 문서는 deprecate됨.
## Microsoft
C++ AMP는 죽은 것처럼 보임. Vendor-independent이면서 Visual C++의 지원을 받았지만 D3D11 후로 업데이트된 적이 없음. 오래된 ROCm 버전 또한 지원됐었음.
## Apple
Metal 연산은 macOS/iOS/…를 위한 것일 뿐. GPGPU 분야에서는 매력이 상당히 떨어짐, 특히나 GPU 연산 성능에선 더욱 그러함.
GPGPU는 벤더,OS마다 상황이 천차만별이라서 언젠가 통합이 되었으면 젛겠내요.
그나저나 윈도우의 DirectML에 대한 언급은 없네요. 하드웨어 폭넓게 지원하고 최근애는 WSL에서도 돌아가게 만들어서 흥미가 생기던데 말이죠.