Manycores는 HPC 커뮤니티에서 성능을 향상시키면서 전력 효율성을 유지하는 방법으로 자리잡고 있습니다. Knights Landing은 인텔 Xeon Phi 아키텍처의 두 번째 세대 제품입니다. 최근 몇 년 동안 CPU, GPU 및 첫 번째 Xeon Phi를 최적화하는데 많은 연구가 이루어졌지만, Knights Landing 프로세서의 새로운 기능들은 이러한 장치에 대한 프로그래밍과 최적화 기법을 다시 검토해야 합니다. 이 연구에서는 그래프와 메모리 제약 애플리케이션의 대표적인 사례 연구로 플로이드-워셜 알고리즘을 선택했습니다. 기본 시리얼 버전에서 시작하여 데이터, 스레드 및 컴파일러 수준 최적화가 병렬 구현에 338 GFLOPS를 달성하는 데 어떻게 도움이 되는지 보여줍니다.
This paper focuses on optimizing the parallel implementation of the Floyd-Warshall algorithm for the Intel Xeon Phi Knights Landing (KNL) processor, which is a manycore architecture designed to improve performance while maintaining power efficiency. The research addresses key challenges in HPC systems related to power consumption and aims to leverage the unique features of KNL processors.
The Floyd-Warshall algorithm is used to find all-pairs shortest paths in graphs and can be computationally expensive with $`O(n^3)`$ operations and $`O(n^2)`$ memory space. The paper begins with a serial version of this algorithm and applies various optimization techniques, including data blocking, SIMD vectorization, and compiler-level optimizations to achieve high performance.
The results show that the optimized parallel implementation reached 338 GFLOPS, demonstrating significant improvements over the naive serial version. Specifically, AVX-512 vectorization provided substantial benefits in terms of computational efficiency. Additionally, optimizing memory access patterns and thread management further enhanced performance.
This work is crucial for advancing HPC systems by efficiently solving complex graph problems on modern manycore architectures like KNL. The findings can be applied to various domains such as communication networking, traffic routing, and bioinformatics, where the ability to process large graphs quickly is essential.
# 소개
전력 소비 문제는 엑사스케일 시스템 설계에 있어 중요한 장애물 중 하나입니다. 이러한 결과로 과학 커뮤니티는 고성능 컴퓨팅(HPC) 시스템의 전력 효율성을 개선하기 위한 다양한 방법을 찾아내고 있습니다. HPC 시스템에서 계산 능력을 높이면서 동시에 전력 소비를 제한하는 최근 추세 중 하나는 NVIDIA/AMD 그래픽 프로세싱 유닛(GPU) 또는 인텔 Many Integrated Core(MIC) 코프로세서와 같은 가속기의 추가입니다. 이러한 다중코어 장치들은 전통적인 CPU보다 더 높은 FLOPS/Watt 비율을 달성할 수 있습니다. 예를 들어, Top500에 기반한 시스템 중 가속기 기술을 사용하는 시스템의 수는 2013년 6월에는 54개였으나 2017년 6월에는 91개로 증가했습니다. 같은 기간 동안 Green500 리스트에 있는 가속기 기반 시스템의 수는 55에서 90으로 늘었습니다.
최근 인텔은 두 번째 세대 MIC 아키텍처(Xeon Phi 브랜드)를 발표하였습니다. 이 KNL(Knights Landing)은 그 전 세대인 KNC(Knights Corner)와 비교하여 AVX-512 확장, 향상된 벡터 유닛 수, 패키지 내 고속 메모리(HBM) 및 독립형 프로세서로 작동할 수 있는 기능 등을 포함하고 있습니다. 그러나 CPU, GPU 및 KNC Xeon Phi의 최적화에 대한 연구가 최근 몇 년 동안 많이 이루어졌음에도 불구하고, KNL 프로세서에서 애플리케이션 가속은 아직 완료되지 않은 작업입니다. 이는 KNL의 상용화가 최근 이루어졌기 때문입니다.
본 연구에서는 그래프 및 메모리 제약 애플리케이션을 대표하는 사례로 플로이드-워셜(Floyd-Warshall) 알고리즘을 선택하였습니다. 이 알고리는 그래프 내 모든 노드 쌍 사이의 최단 경로를 찾는 데 사용되며 통신 네트워킹, 교통 라우팅, 생물정보학 등 다양한 분야에서 활용됩니다. 플로이드-워셜 알고리즘은 계산 및 공간적으로 비용이 많이 들며 $`O(n^3)`$ 연산과 $`O(n^2)`$ 메모리 공간을 필요로 합니다. 여기서 기본 시리얼 버전부터 시작하여 데이터, 스레드 및 컴파일러 수준 최적화가 병렬 구현에 338 GFLOPS를 달성하는 데 어떻게 도움이 되는지 보여줍니다.
본 논문의 나머지 부분은 다음과 같이 구성되어 있습니다. 섹션 [6]에서는 Intel Xeon Phi KNL 아키텍처를 간략히 소개하고, 섹션 [7]에서는 플로이드-워셜 알고리즘을 설명합니다. 섹션 [14]에서는 우리의 구현에 대해 설명하며, 섹션 [9]에서는 성능 결과를 분석하고 섹션 [12]에서는 관련 작업을 논의합니다. 마지막으로 섹션 [13]에서는 결론과 향후 연구 방향을 제시합니다.
플로이드-워셜 알고리즘
플로이드-워셜 알고리즘은 유도된 프로그래밍 접근법을 사용하여 방향 그래프에서 모든 쌍의 최단 경로 문제를 해결합니다. 이 알고리는 $`N \times N`$ 거리 행렬 $`D`$를 입력으로 받고, 여기서 $`D_{i,j}`$는 노드 i에서 노드 j까지의 원래 거리를 초기화합니다. 플로이드-워셜 알고리는 $`N`$ 회전을 수행하고 각 회전에서는 중간 노드 k를 통해 각 쌍의 정점 사이에 가능한 모든 경로를 평가합니다. 결과적으로, 플로이드-워셜은 업데이트된 행렬 $`D`$를 생성하며 여기서 $`D_{i,j}`$는 이제 노드 i와 j 사이의 최단 거리를 포함하게 됩니다. 또한, 최단 경로 재구성에 필요한 경우 추가적인 행렬 $`P`$가 생성됩니다. 여기서 $`P_{i,j}`$는 중간 노드 k를 통해 가장 최근에 추가된 정점 i와 j 사이의 노드입니다.
Intel Xeon Phi Knights Landing
KNL은 인텔 Xeon Phi 제품군의 두 번째 세대이며 독립형 프로세서로 작동할 수 있는 첫 번째 제품입니다. KNL 아키텍처는 2D 메시를 통해 연결된 Tiles (최대 36개) 집합을 기반으로 합니다. 각 타일에는 인-오더 Intel Atom 마이크로아키텍처(4 스레드 당 코어)를 기반으로 하는 2개의 코어, 2개의 벡터 프로세싱 유닛(VPU), 공유 L2 캐시 1MB가 포함되어 있습니다. 이러한 VPU는 새로운 512비트 AVX-512 ISA뿐만 아니라 SSEx 및 AVXx와 같은 이전 벡터 ISA에도 호환됩니다. AVX-512는 512비트 SIMD 지원, 32개의 논리 레지스터, 8개의 새로운 마스크 레지스터를 위한 벡터 예측 및 희소 데이터 로드와 저장을 지원하는 gather 및 scatter 명령어를 제공합니다. 각 AVX-512 명령은 복수정밀도(DP)에서 8개의 연산 또는 단정밀도(SP)에서 16개의 연산을 수행할 수 있으므로 피크 성능은 DP에서는 1.5 TFLOPS 이상, SP에서는 3 TFLOPS로 KNC보다 두 배 이상 높습니다. 또한 전력 효율성 측면에서도 그 이전 세대보다 우수합니다.
KNL 아키텍처의 다른 중요한 특징 중 하나는 패키지 내에 MCDRAM이라는 고속 메모리(HBM)를 포함하는 것입니다. 이 특별한 메모리는 Cache, Flat 및 Hybrid 3가지 운영 모드로 구성됩니다. Cache 모드에서는 MCDRAM이 DDR4 레벨의 메모리를 캐싱하는 L3 캐시처럼 작동합니다. 애플리케이션 코드는 변경되지 않지만, MCDRAM은 성능 저하를 겪을 수 있습니다. Flat 모드에서는 MCDRAM이 물리적 주소 가능한 공간으로 제공되어 가장 높은 대역폭과 최저 지연 시간을 갖습니다. 그러나 애플리케이션에서 DDR 및 MCDRAM 모두를 사용하기 위해서는 소프트웨어 수정이 필요할 수 있습니다. 마지막으로, Hybrid 모드에서는 HBM이 두 부분으로 나뉩니다: 하나는 Cache 모드이고 다른 하나는 Flat 모드입니다.
소프트웨어 관점에서 보면 KNL은 전통적인 HPC 시스템에서 사용되는 병렬 프로그래밍 모델인 OpenMP 또는 MPI를 지원합니다. 이 사실은 CUDA나 OpenCL과 같은 가속기 특정 프로그래밍 언어 기반의 다른 대안에 비해 코드 개발을 단순화하고 포터블성을 향상시킨다는 점에서 강점입니다. 그러나 높은 성능을 달성하려면 다음과 같은 것들에 주목해야 합니다:
- 큰 데이터세트를 다룰 때 메모리 계층의 효율적인 활용, 그리고
- VPUs를 활용하기 위해 어떻게 연산을 구조화할 것인가.
자동 벡터화는 VPUs를 활용하는 가장 쉬운 프로그래밍 방법입니다. 그러나 대부분의 경우 컴파일러는 루프 내에서 자유 데이터 종속성을 감지하지 못해 SIMD 바이너리 코드를 생성하지 못합니다. 이 측면에서는 KNL 프로세서는 지도 컴파일 또는 고수준 명령어(intrinsic)를 사용하여 SIMD 명령어를 지원합니다. 한편, 가이드 벡터화에서는 개발자가 루프가 독립적임을 나타내고 그 메모리 접근 패턴을 삽입함으로써 컴파일러가 SIMD 바이너리 코드를 생성하고 프로그램의 포터블성을 유지할 수 있습니다. 다른 한편, 고수준 명령어 벡터화는 해당 알고리즘 대부분을 재작성하는 것이 필요합니다. 개발자는 제어력을 얻지만 포터블성을 잃게 됩니다. 또한 이 접근 방식은 루프 수준 최적화를 중지시키는 경향이 있습니다. 그럼에도 불구하고 정규적인 접근 패턴이나 루프 데이터 종속성을 재계산 기법으로 숨길 수 없는 일부 애플리케이션에서는 유일한 병렬성 활용 방법입니다.
실험적 결과
실험 설계
모든 테스트는 CentOS 7.2를 실행하는 Intel 서버에서 수행되었습니다. 이 서버에는 Xeon Phi 7250 프로세서(68 코어, 1.40GHz, 코어당 4개의 하드웨어 스레드 및 16GB MCDRAM 메모리)와 48GB 메인 메모리가 장착되어 있습니다. 프로세서는 Flat 모드와 Quadrant 클러스터 모드에서 작동했습니다.
Intel의 ICC 컴파일러(버전 17.0.1.132)를 사용하여 -O3 최적화 수준을 적용했습니다. 명시적인 AVX2 및 AVX-512 명령어를 생성하기 위해 각각 -xAVX2, -xMIC-AVX512 플래그를 사용했습니다. 또한, numactl 유틸리티를 사용하여 MCDRAM 메모리를 활용했으며 소스 코드 수정은 필요하지 않았습니다. 또한 다양한 작업 부하를 테스트하였습니다: N = {4096, 8192, 16384, 32768, 65536}.
성능 결과
먼저, 기본 시리얼 버전에 적용된 다양한 최적화 기법의 성능 향상을 평가했습니다. 이를 위해 블록킹(blocked), 데이터 수준 병렬성(simd, simd (AVX2) 및 simd (AVX-512)), 정렬된 접근(aligned) 및 루프 언롤링(unrolled) 등의 최적화 기법을 사용했습니다. 표 [1]은 N = 4096일 때 각각의 시리얼 버전의 실행 시간(초)을 보여줍니다. 여기서 볼 수 있듯이 블록킹 최적화는 실행 시간을 약 5% 줄였습니다. 블록 크기로 256 $`\times`$ 256이 가장 효과적이었습니다. 각 회전에서 가장 메모리 요구가 많은 경우(4단계), 캐시에 네 개의 블록이 로드됩니다 (3개의 거리 블록과 1개의 경로 블록). 이 네 개의 블록은 4 $`\times`$ 256 $`\times`$ 256 $`\times`$ 4 바이트 = 1024 KB = 1MB가 필요하며, L2 캐시 크기와 정확히 일치합니다.
…
이 글은 ArXiv의 공개 자료를 바탕으로 AI가 자동 번역 및 요약한 내용입니다.
저작권은 원저자에게 있으며, 인류 지식 발전에 기여한 연구자분들께 감사드립니다.