로컬 언어 모델을 CUDA로 실행하거나 검증하는 개발자를 위해, 일부 계산에서 다른 작업이 읽고 있는 메모리를 너무 일찍 덮어쓸 수 있던 문제가 수정됐다. 개발자는 작업 순서가 겹치는 문제를 잡는 검사 도구의 경고가 사라졌다고 보고했으며, 이번 변경의 의미는 속도 개선보다 계산 순서의 안전성에 있다.
1. 문제가 생긴 위치
2026년 10월 19일 공개된 llama.cpp b11724는 이 수정이 포함된 사전 릴리스다. 수정 대상은 CUDA의 벡터형 flash attention 커널, 즉 GPU에서 어텐션 계산을 수행하는 코드다.
문제는 계산한 점수를 함께 쓰는 메모리에 저장한 뒤, 다음 반복에서도 같은 공간을 재사용하는 과정에 있었다. 함께 보는 메모장을 누군가 다 읽기 전에 다른 사람이 새 내용으로 덮어쓰는 상황과 같다. 개발자는 이를 읽기 뒤 쓰기 경쟁으로 설명했다.
2. 수정 방식
패치는 반복문 끝에 warp 단위 동기화를 추가한다. warp는 스레드 묶음이고 lane은 그 안의 개별 실행 단위로, 같은 묶음의 읽기가 끝날 때까지 다음 덮어쓰기를 기다리게 한다.
ggml_cuda_syncwarp(); // Needed for KQ synchronization.위 코드는 패치에 추가된 한 줄 그대로다. 개발자는 관련 읽기와 쓰기가 같은 스레드 묶음 안에서 이뤄지므로 이 범위의 동기화면 충분하다고 설명했다. 사용자 설정을 바꾸는 예제가 아니라 커널 내부의 변경이다.
3. 확인 결과와 범위
개발자는 기준 커밋 e467e5b에서 RTX 3090으로 확인했다.
GPU 아키텍처는 sm_86이며 NVIDIA 드라이버 버전은 610.43.03이었다.
경쟁 검사는 아래 정확성 검사와 같은 연산을 대상으로 했으며, 세부 설정은 hsk=256과 nb=1이었다.
이 조건에서 메모리 접근 순서 충돌을 검사하는 racecheck의 경고는 수정 전 8,007,424건에서 수정 뒤 0건으로 줄었다.
정확성 검사는 선택한 38개 항목이 수정 전과 후 모두 통과했다. 수정 뒤 전체 FLASH_ATTN_EXT 정확성 검사도 3,993개 중 3,993개가 통과했다. 전체 검사의 수정 전 결과는 제시되지 않았다. 작성자는 이 경쟁으로 잘못된 출력이 발생한 사례를 관측하지 못했다고 덧붙였다.
4. 기대 효과와 남은 점
얻는 것은 공유 메모리를 재사용할 때 읽기와 쓰기의 순서를 맞추는 보장이고, 대가로는 스레드 사이에 기다리는 지점이 추가된다. 다만 성능 변화는 공개된 자료에 제시되지 않았으므로, 이 대기를 실제 속도 저하로 해석하거나 경고 감소를 처리량 향상으로 읽어서는 안 된다.
적용 여부를 판단할 때는 사용 중인 실행 경로가 수정 대상인지부터 확인하는 편이 타당하다. 공개된 검증은 앞서 밝힌 하드웨어와 설정에 한정되며, 다른 하드웨어나 CUDA 이외의 실행 경로에 대한 검증 결과는 제시되지 않았다.
이번 수정은 출력 개선을 약속하기보다 CUDA 공유 메모리 재사용 순서를 바로잡고 검사 경고를 제거한 안정성 패치다.
