AVX‑512 기반 제로패딩 블록형 SpMV 가속기술
초록
본 논문은 AVX‑512 명령어 집합의 마스크 연산을 활용해 블록 기반 희소 행렬‑벡터 곱(SpMV)에서 제로 패딩 없이 효율적인 메모리 저장 방식을 제안한다. 마스크 기반 블록 포맷과 어셈블리 수준 최적화 커널을 설계하고, 실행 시간 예측을 위한 간단한 보간 기법을 도입해 최적 블록 크기를 자동 선택한다. Intel MKL CSR 및 CSR5와 비교했을 때 순차 및 멀티스레드 환경에서 상당한 성능 향상을 보이며, 구현 코드는 오픈소스 라이브러리 SPC5에 공개된다.
상세 분석
이 연구는 최신 인텔 CPU의 AVX‑512 확장에 포함된 vexpandpd·vexpandps와 같은 마스크 기반 로드 명령을 핵심으로 삼는다. 기존 블록 기반 포맷(BCSR, UBSCR 등)은 블록을 밀집(dense) 형태로 만들기 위해 제로 패딩을 삽입해야 했으며, 이는 메모리 대역폭을 크게 낭비하고 캐시 효율을 저하시켰다. 저자들은 블록 내부의 비제로 원소 위치를 1‑bit 마스크로 기록하고, 실제 비제로 값만을 연속적으로 저장하는 새로운 포맷 β(r,c)를 정의한다. block_masks 배열은 각 블록에 대한 마스크를 보관하고, block_colidx는 블록의 좌상단 열 인덱스를, block_rowptr는 r‑행 단위 블록 수를 누적해 저장한다. 이렇게 하면 블록 크기에 관계없이 메모리 사용량이 CSR와 거의 동일하면서도, AVX‑512 마스크 로드를 통해 한 번에 최대 VEC_SIZE(16·float, 8·double) 개의 원소를 벡터 레지스터에 채울 수 있다.
핵심 커널은 어셈블리 수준에서 구현되었으며, 주요 최적화는 다음과 같다.
- 마스크 확장:
vexpandpd를 이용해 마스크 비트가 1인 위치의 메모리 값을 바로 레지스터에 배치, 불필요한 스캐터/게더 연산을 회피. - 루프 언롤링 및 레지스터 재사용: 블록 내부 연산을 2~4 단계로 분할해 파이프라인 스톰을 최소화하고, 누산 레지스터를 재사용해 메모리 접근을 감소.
- 프리패치와 메모리 정렬: 블록 시작 주소와 마스크 배열을 64‑byte 경계에 맞추어 캐시 라인 충돌을 방지하고,
prefetch명령으로 차기 블록 데이터를 미리 로드. - 스레드 스케줄링: OpenMP 기반 공유 메모리 병렬화를 적용했으며, 블록 단위 작업 분배를
block_rowptr기반으로 수행해 부하 균형을 자동 조정한다.
또한, 최적 블록 크기(r,c)를 사전에 알기 어려운 점을 해결하기 위해 “레코드 기반 예측” 방식을 제안한다. 초기 실행 시 여러 블록 크기에 대해 짧은 벤치마크를 수행하고, 얻은 실행 시간 데이터를 다항식 보간(순차) 혹은 선형 회귀(병렬) 모델에 적용해 향후 실행에 사용할 최적 블록을 예측한다. 이 방법은 추가적인 매트릭스 분석 없이도 자동 튜닝이 가능하도록 설계되었다.
성능 평가에서는 30여 개의 대표적인 실험용 매트릭스를 사용했으며, Intel Xeon Scalable (Cascade Lake) 프로세서에서 단일 코어와 24코어(2‑socket) 환경을 테스트했다. 결과는 다음과 같다.
- 단일 코어: 평균 1.3×~2.0× 향상, 최고 2.8×까지 MKL CSR 대비 가속.
- 멀티코어: 24코어에서 1.5×~2.2× 스케일링, 특히 비대칭적인 스파스 패턴을 가진 매트릭스에서 큰 이득을 보였다.
- CSR5와 비교: CSR5가 일부 매트릭스에서 메모리 친화적이었지만, 마스크 기반 블록은 전반적으로 더 낮은 메모리 대역폭 사용량과 높은 FLOP/Byte 비율을 달성했다.
마지막으로, 저자들은 모든 소스 코드를 GitLab에 공개하고, 사용자가 직접 블록 크기와 마스크 포맷을 실험해볼 수 있도록 상세한 문서와 빌드 스크립트를 제공한다. 이는 연구 재현성을 높이고, 실제 과학·공학 애플리케이션에 바로 적용할 수 있는 실용성을 강조한다.
댓글 및 학술 토론
Loading comments...
의견 남기기