피드로 돌아가기
Dev.toInfrastructure
원문 읽기
CGO_ENABLED=0 설정으로 cgo 없이 CUDA Driver API 동적 로딩 구현
Calling CUDA from Go without cgo
AI 요약
Context
Go 기반 인프라 시스템에서 GPU 가속을 위해 Python 사이드카를 운영하며 발생하는 직렬화 오버헤드와 배포 복잡성 해결 필요. 기존 cgo 방식은 빌드 타임의 CUDA Toolkit 의존성과 크로스 컴파일 제약으로 인해 Go의 단일 바이너리 배포 장점을 저해함.
Technical Solution
- 빌드 타임 링크를 배제하고 런타임에 libcuda.so.1(Linux) 또는 nvcuda.dll(Windows)을 동적으로 로드하는 구조 설계
- CGO_ENABLED=0 설정을 유지하여 C 컴파일러와 헤더 파일 없이 순수 Go 바이너리 빌드 환경 구축
- CUDA Driver API의 심볼을 런타임에 바인딩하여 cuInit, cuDriverGetVersion 등 핵심 함수 호출 체계 구현
- 미리 컴파일된 PTX 모듈을 런타임에 로드하고 Kernel Launch를 직접 제어하는 메모리 관리 모델 적용
- GPU 가용 여부에 따라 GPU 경로와 CPU 폴백 경로를 선택적으로 실행하는 유연한 실행 전략 채택
실천 포인트
- 대규모 배치 작업 시 GPU 가속을 검토하되, 작은 배치에서는 CPU 성능이 우세함을 고려하여 임계치 설정 - 빌드 파이프라인 단순화를 위해 정적 링크 대신 런타임 동적 라이브러리 로딩 방식 검토 - Cgo 의존성 제거를 통한 CI/CD 빌드 속도 향상 및 크로스 컴파일 제약 해소 방안 적용