NVIDIA가 CUDA Toolkit 13.5를 공개하고 Vera Rubin GPU 아키텍처의 정식 지원을 시작했다. GPU를 나눠 쓰는 개발자는 자원 배분을 더 세밀하게 조정하고, 여러 GPU를 쓰는 팀은 통신과 계산을 하나의 실행 코드에 묶을 수 있다.

1. GPU 자원 배분을 직접 조정

새 버전은 GPU의 연산 묶음인 스트리밍 멀티프로세서(SM)를 지역성 영역(메모리 접근이 가까운 단위)별로 배정하는 방식을 확장했다. 기본 설정은 각 영역에 같은 수의 SM을 보장하고 남는 SM을 영역 밖에 둔다. 새 설정을 함께 쓰면 남는 SM도 선택된 영역에 포함할 수 있지만, 영역별 SM 수가 서로 달라질 수 있다.

애플리케이션은 자원 분할 조회 기능으로 각 영역의 SM 수를 확인해 작업량을 배분할 수 있다. 따라서 영역마다 같은 크기를 유지해 예측 가능성을 택하거나, 각 영역에서 가능한 SM을 더 많이 활용하는 방향을 선택할 수 있다.

여러 프로세스가 GPU를 공유하는 MPS v3에는 가중 시간 분할이 추가됐다. 서버별로 기본 시간에 배율을 설정해 계산 시간을 조정하는 방식으로, 더 긴 계산 시간이 필요한 작업을 맡은 서버에 시간을 더 줄 수 있다.

SM 파티션 부하 분산 기능은 여유가 있을 때 기본 파티션 바깥의 SM을 빌려 쓰고, 클라이언트가 없는 파티션은 자원을 빌려줄 수 있도록 한다. 빌림과 대여는 각각 설정 가능하며, MPS는 빌린 자원을 재배정하기 전에 회수한다.

메모리 사용량 알림에 의존하기 어려운 환경에서는 자원 회수 여부를 판단할 때 현재 사용량과 한도를 직접 읽는 폴링 방식을 사용할 수 있다. 알림 전달 의존성을 낮추는 대신 자원 회수 판단마다 추가 작업이 든다.

2. CUDA Tile에서 다중 GPU 통신

GPU에서 실행하는 코드인 CUDA Tile 커널은 이제 여러 GPU와 직접 통신할 수 있다. 단일 대상 포인터로 GPU 간 연결 기술인 NVLink로 연결된 GPU의 메모리에 접근한다. 다중 대상 포인터와 전용 연산은 여러 GPU를 연결하는 스위치인 NVSwitch 연결망에서 여러 GPU의 결과를 합치거나 데이터를 저장한다. 이때 연결망은 여러 GPU 결과를 합치는 통신 기술인 NVLink SHARP를 지원해야 한다.

GPU들이 같은 메모리를 보도록 하는 공유 메모리 매핑을 실행 전에 준비하면 통신과 계산을 커널 내부에서 결합할 수 있다. 예를 들어 행렬 곱셈과 GPU 간 결과 합산을 하나의 커널에 묶는 방식이다.

Tile 커널에서 기존 스레드 기반 실행 방식인 SIMT의 라이브러리 함수를 호출하는 기능도 공개 프리뷰로 나왔다. 별도 커널 사이에 데이터를 전달하던 방식에서 벗어나, 커널이 이미 가진 데이터를 바로 처리하는 길이 열린다. 대상 라이브러리의 지원은 순차적으로 활성화될 예정이다.

3. Python과 CCCL의 개발 편의

CUDA Python 핵심 라이브러리 1.2의 배치 복사는 여러 버퍼 복사를 한 번의 드라이버 호출로 묶어 제출한다. 실행 절차를 재사용하는 CUDA Graph도 실행할 그래프를 다시 만들지 않고 커널 매개변수와 메모리 복사 등을 갱신할 수 있어, 애플리케이션 매개변수가 바뀌어도 기존 그래프를 재사용할 수 있다.

프로그램적 의존 실행은 GPU 명령 기능의 세대 등급을 나타내는 컴퓨트 기능 수준이 9.0 이상인 GPU에서 협력하는 커널이 같은 스트림 안에서 겹쳐 실행되도록 한다. 뒤따르는 커널은 앞선 커널이 끝나기 전에도 독립 작업을 시작할 수 있다.

아래는 원문에 실린 설정 예시다. 커널은 프로그램적 의존 실행의 동기화 규약을 구현해야 한다.

from cuda.core import LaunchConfig, launch

config = LaunchConfig(
    grid=num_blocks,
    block=256,
    programmatic_stream_serialization=True,
)

# The kernel must implement the PDL synchronization protocol.
launch(stream, config, dependent_kernel, *kernel_args)

GPU 알고리즘 라이브러리 모음인 CCCL 3.5에서는 CUB의 공개 튜닝 정책으로 블록당 스레드 수 등 알고리즘 실행 설정을 직접 조정할 수 있다.

부동소수점 누적 합산은 합산 순서를 고정하도록 요청해, 같은 GPU·입력·빌드 구성에서 반복 실행 결과를 재현할 수 있다.

여러 구간에서 각각 상위 또는 하위 K개 항목을 뽑는 일괄 선택 기능도 추가됐다. NVIDIA는 이 기능이 언어 모델 추론 라이브러리 FlashInfer에 통합됐다고 밝혔다.

4. 수학·이미지 라이브러리의 성능 개선

cuBLAS에서 64비트 부동소수점(FP64) 연산을 직접 수행하는 대칭 갱신 개선은 고유값 풀이와 행렬 분해 같은 과학 계산에 해당한다. NVIDIA에 따르면 일부 연산은 NVIDIA B200에서 최대 1.5배 빨라졌고, 이 연산을 쓰는 코드는 수정 없이 성능 개선을 얻을 수 있다.

cuSPARSE의 CSR(행 단위 압축 저장) 희소 행렬·밀집 행렬 곱셈 ALG3는 FP32(32비트 부동소수점)·FP64 연산을 개선했다. NVIDIA는 데이터센터 GPU에서 이 연산이 1.65~2.27배 빨라졌다고 밝혔다.

표: cuSPARSE 희소 삼각 풀이 ALG2의 ALG1 대비 성능

조건: NVIDIA 발표 기준. 희소 삼각 풀이의 ALG1 대비 ALG2 성능이며, 측정 장비는 원문에 제시되지 않았다.

단위: 속도 배수(배)

수학·이미지 라이브러리의 성능 개선
라이브러리·연산장비·연산 조건비교 기준향상폭집계 방식
cuSPARSE 희소 삼각 풀이 ALG2장비는 제시되지 않았다ALG12.7배기하평균

기하평균은 여러 비율을 곱해 평균을 구하는 방식이다.

희소 삼각 시스템을 반복해서 푸는 작업에서는 풀이 시간과 준비 시간을 나눠 살펴볼 수 있다. ALG2는 반복 풀이 성능을 높인다. NVIDIA에 따르면 풀이 전 분석 단계도 기하평균 2.79배 빨라져 준비 시간을 줄인다.

NVIDIA는 cuSPARSE의 그래프 색칠도 기하평균 약 3배 빨라졌다고 밝혔다.

nvJPEG의 GPU 하이브리드 디코딩은 이미지 크기·표준 허프만 테이블 사용 여부에 따라 처리량이 10~600% 증가했다고 NVIDIA는 밝혔다.

5. 실행 시점 부담을 배포 단계로 이동

nvprune의 사전 컴파일은 패키징 중 중간 디바이스 코드(실행 기기에 맞춰 바꾸는 중간 코드)를 GPU가 직접 실행할 기계어로 바꿔, 대상 아키텍처가 정해진 배포물의 실행 시점 컴파일 부담을 없앤다. 대신 배포자가 대상 환경에 맞는 아키텍처를 선택하고 지원할 GPU에서 결과물을 검증하는 일을 맡는다.

Rubin 및 이후 GPU의 Windows 배포는 기존 TCC 대신 WDDM이나 계산 전용 MCDM 드라이버 모드를 사용해야 한다.

cuobjdump의 심볼 출력은 설명이 붙은 네 열 형식으로 바뀌므로 해당 출력을 읽는 스크립트도 수정해야 한다.

CUDA 13.5의 핵심은 GPU를 나누고 여러 GPU를 연결하는 선택지를 넓혀, 개발자가 자원 활용과 실행 방식 사이의 균형을 직접 조정하게 한 데 있다.