CUDA: im2col (2D 및 3D)에서 OW > 65535 처리 (#22944)
요약
본 기술 기사는 CUDA 기반의 im2col(2D 및 3D) 구현에서 출력 너비(OW)가 GPU 그리드 크기 제한인 65535를 초과할 때 발생하는 문제를 해결하는 방법을 설명합니다. 특히, 긴 오디오 데이터(예: 11초/16kHz)를 처리하는 Conv1d 인코더의 경우 OW가 이 한계를 넘어 '유효하지 않은 구성 인수' 오류를 발생시켰습니다. 이를 해결하기 위해 `block_nums.y`를 실제 OW와 GPU 최대 그리드 크기(`MAX_GRIDDIM_Y`) 중 작은 값으로 클램프하고, 커널 내부에서 스트라이드를 사용하여 나머지 영역을 루프 처리하도록 수정했습니다.
핵심 포인트
- CUDA의 im2col 함수는 출력 너비(OW)가 65535를 초과할 경우 그리드 크기 제한으로 인해 오류가 발생합니다.
- 이 문제는 특히 긴 시퀀스 데이터(예: 오디오 임베딩)를 처리하는 3D/1D 컨볼루션 레이어에서 두드러지게 나타납니다.
- 해결책은 `block_nums.y`를 GPU 최대 그리드 크기로 제한하고, 커널 내부 루프를 통해 초과된 영역을 순차적으로 계산하도록 수정하는 것입니다.
- 이 수정 사항은 2D 및 3D im2col 커널 모두에 적용되었으며, 기존의 테스트 케이스는 영향을 받지 않습니다.
CUDA: im2col (2D 및 3D)에서 OW > 65535 처리 (#22944). im2col_cuda와 im2col_3d_cuda 모두 block_nums.y = OW로 디스패치합니다. CUDA는 그리드 Y를 65535로 제한합니다. T > 65535 (~ 4초)의 원시 16kHz 오디오에 대한 Conv1d 인코더는 이 한계를 초과할 수 있습니다. 예를 들어, SEANet이 11초에서 실행되면 OW = 176000에 도달하며, 이는 유효하지 않은 구성 인수(invalid configuration argument)를 반환합니다. block_nums.y를 MIN(OW, MAX_GRIDDIM_Y)로 클램프하고 커널 내부에서 스트라이드 MAX_GRIDDIM_Y로 루프를 실행합니다. Z축에 이미 사용된 인-커널 스트라이드 패턴과 동일합니다 (MAX_GRIDDIM_Z). 2D im2col_kernel과 3D im2col_3d_kernel 모두 같은 수정이 필요합니다. OW <= 65535인 경우 비트 단위로 동일합니다(새로운 외부 루프의 단일 반복). T4 / Jetson Orin에서 11초/16kHz 오디오에 대해 SEANet 인코더를 실행한 테스트를 거쳤습니다 (im2col이 OW ~ 176000에 도달). 수정 전에는 유효하지 않은 구성 인수(invalid configuration argument)가 반환되었으나, 수정 후에는 완료까지 실행됩니다. 기존의 test-backend-ops im2col 케이스는 변경되지 않았습니다.
macOS/iOS: macOS Apple Silicon (arm64), macOS Apple Silicon (arm64, KleidiAI enabled), macOS Intel (x64), iOS XCFramework
Linux: Ubuntu x64 (CPU), Ubuntu arm64 (CPU), Ubuntu s390x (CPU), Ubuntu x64 (Vulkan), Ubuntu arm64 (Vulkan), Ubuntu x64 (ROCm 7.2), Ubuntu x64 (OpenVINO), Ubuntu x64 (SYCL FP32), Ubuntu x64 (SYCL FP16)
Android: Android arm64 (CPU)
Windows: Windows x64 (CPU), Windows arm64 (CPU), Windows x64 (CUDA 12) - CUDA 12.4 DLLs, Windows x64 (CUDA 13) - CUDA 13.1 DLLs, Windows x64 (Vulkan), Windows x64 (SYCL), Windows x64 (HIP)
openEuler: openEuler x86 (310p), openEuler x86 (910b, ACL Graph), openEuler aarch64 (310p), openEuler aarch64 (910b, ACL Graph)
AI 자동 생성 콘텐츠
본 콘텐츠는 llama.cpp Releases의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기