핵심 개념
본 논문에서는 Hdiv-conforming 불연속 Galerkin 방법을 사용하여 이산화된 Stokes 문제를 해결하기 위한 효율적인 매트릭스 없는 다중 그리드 방법을 제시하고, GPU 시스템에서의 구현 및 성능 최적화 기법에 대해 자세히 설명합니다.
본 논문은 계산 유체 역학(CFD), 특히 Navier-Stokes 방정식의 관성항을 명시적으로 처리하는 정상 상태 계산이나 암시적-명시적 시간 단계 방식을 적용할 때 중요한 작업인 Stokes 방정식의 효율적인 솔루션에 대해 다룹니다. 다중 그리드 방법은 가장 효율적인 전처리기 및 솔버 중 하나로 알려져 있습니다. 발산 적합 불연속 Galerkin(DG) 방법과 중첩 정점 패치 스무더를 결합하면 효과적인 다중 그리드 방법이 생성되고 Laplacian과 비슷한 Stokes 문제에 대한 수렴 속도를 얻을 수 있습니다[16]. 최근 몇 년 동안 그래픽 처리 장치(GPU)의 등장으로 상당한 계산 능력이 제공되었지만 이러한 장치를 활용하려면 알고리즘을 재설계해야 합니다. 따라서 이 연구에서는 이러한 다중 그리드 방법의 GPU 가속에 중점을 둡니다. 이 작업은 libCEED [1], PETSc [25], MFEM [2], deal.II [3]와 같은 널리 사용되는 계산 라이브러리에 효율적인 GPU 구현을 제공하려는 전 세계적인 노력의 일환으로 볼 수 있습니다.
Stokes 문제에 대한 DG 이산화 및 매트릭스 없는 평가
본 논문에서는 Stokes 방정식에 대한 수치적 해를 조사하고, Hdiv-conforming 불연속 Galerkin(DG) 방법을 사용하여 Stokes 방정식을 이산화합니다. 이산화된 방정식을 풀기 위해 매트릭스 없는 다중 그리드 방법을 사용하며, 이 방법은 Raviart-Thomas 요소를 활용하고 자세한 GPU 최적화 전략을 사용합니다. 이 접근 방식은 속도 및 압력 공간 모두에서 작동하므로 전역 Schur complement 근사치가 필요하지 않습니다. 매트릭스 없는 연산자 평가는 Raviart-Thomas 요소의 텐서 곱 구조와 최적화되고 충돌 없는 공유 메모리 액세스 패턴을 활용하여 뛰어난 성능 수치를 보여주며 단일 NVIDIA A100 GPU에서 초당 10억 개 이상의 자유도에 도달합니다. 수치 결과는 3차원 포아송 문제의 효율성과 비슷합니다.
다중 그리드 방법 및 정점 패치 스무더
본 논문에서는 [5, 6]에서 제안한 유한 요소 다단계 전처리기를 공식화하기 위해 일련의 미세 메시를 설정하고, 각 레벨에서의 스무딩 작업에 중점을 둡니다. 특히, 공간 Xℓ의 부분 공간 분해를 활용하는 스무딩 연산자 클래스인 S ℓ에 대해 자세히 설명합니다. 각 정점 패치 j는 유한 요소 솔루션 공간의 부분 공간인 Xℓ, j와 연결되며, 이 부분 공간은 해당 패치에서만 지원되고 다른 곳에서는 0인 함수로 구성됩니다. 이 구성은 자 naturalmente 속도 부분 공간 Vℓ, j의 미끄럼 방지 경계 조건을 적용합니다. 덧셈 버전은 사소하게 병렬화할 수 있지만 3차원에서 1/8 미만의 감쇠 계수가 필요하기 때문에 수렴 속성이 최적이 아닙니다. 따라서 곱셈 Schwarz 스무더의 병렬 구현에 중점을 둡니다. 곱셈 스무더의 병렬 실행을 용이하게 하기 위해 Rℓ,iAℓRTℓ, j = 0을 만족하는 정점 패치 색상 지정 방법을 적용하여 경쟁 조건을 방지하기 위해 병렬로 처리할 수 있는 그림 3과 같이 패치를 겹치지 않는 그룹으로 세분화할 수 있습니다. 표준 문헌 규칙에 따라 이 세분화 과정을 "색상 지정"이라고 합니다.
로컬 솔버 및 빠른 대각화
계산 실습에서 로컬 이산화 행렬을 효율적으로 반전시키는 문제에 반복적으로 직면합니다. 특히 고차 유한 요소의 경우 SVD(Singular Value Decomposition)를 통해 이러한 로컬 문제를 직접 해결하는 것은 비용이 많이 듭니다. 각 대각 블록 A j가 분리 가능한 Kronecker 표현을 허용하기 때문에 [23]에서 제안한 대로 빠른 대각화 방법을 사용하여 역행렬을 효율적으로 계산할 수 있습니다. 로컬 연산자 A j는 직접 빠른 반전에 적합하지 않지만 솔루션에 Schur complement를 사용합니다. 압력 성분 P의 경우 공액 기울기 방법을 사용하여 첫 번째 방정식 S P = BTA−1j F −G를 풀고, 여기서 S는 공식 S = BTA−1j B j를 사용하는 Schur complement입니다. 반복하는 동안 S를 명시적으로 계산할 필요가 없습니다. 대신 B가 (8)에 표시된 대로 낮은 순위 표현을 갖는 S v = BTj[A−1j [B jv]]를 계산합니다. 한편, A−1j의 연산은 [10]과 같이 [23]의 빠른 대각화 방법을 사용하여 효율적으로 수행할 수 있습니다. 마지막으로 빠른 대각화 방법을 다시 적용하여 속도 성분 U에 대한 두 번째 방정식을 풀 수 있습니다.
효율성 및 수렴성
고차 방법의 동기는 주어진 자유도 예산으로 더 높은 정확도를 달성하거나 더 일반적으로 더 적은 자유도로 특정 수준의 정확도를 달성할 수 있는 계산 강도에 있습니다. 궁극적인 목표는 규정된 정확도를 달성하면서 계산 시간을 최소화하는 것입니다. 수치적 증거에 따르면 제안된 스무더는 반복 횟수 측면에서 매우 효율적인 다중 그리드 방법을 생성합니다. 결과를 요약하면 반복 횟수가 미세화 수준 L에 의존하지 않는다는 것을 알 수 있습니다. 또한 결과는 수렴 단계가 다항식 차수의 증가에 따라 점진적으로 감소한다는 것을 보여줍니다.
GPU 구현 및 성능 분석
이전 연구[9, 10]를 기반으로 Poisson 문제를 해결하는 알고리즘의 효능을 입증했으며, 현재 연구 문제를 개선하기 위해 이러한 설계 원칙을 계속 발전시키고 있습니다. deal.II [3] 유한 요소 라이브러리, 특히 다중 그리드 프레임워크를 기반으로 하는 구현을 사용합니다. 이 연구의 모든 수치 실험은 VRAM용으로 80GB의 고속 HBM2e 메모리를 갖춘 단일 NVIDIA Ampere A100 SXM4 GPU에서 수행되며, 이 GPU는 1.27GHz에서 2TB/s의 최대 메모리 대역폭과 8.7TFLOPS/s의 최대 배정밀도 성능을 제공하며 2개의 AMD EPYC 7282 16코어 프로세서가 장착된 시스템에서 호스팅됩니다.
GPU 최적화 전략
성능을 최적화하는 데 중요한 한 가지 측면은 호스트와 장치 간의 메모리 전송을 최소화하는 것입니다. 이를 위해 전체 솔버가 GPU에서 직접 구현되었습니다. 설정 단계에서 필요한 모든 벡터와 데이터 구조가 GPU에 할당되고 초기화됩니다. 이 설정을 통해 선형 시스템을 솔루션하는 동안 CPU와 GPU 간에 데이터를 통신할 필요가 없으므로 성능이 향상되고 대 레이턴시가 감소합니다. 그런 다음 GPU에서 높은 성능을 달성하려면 일반적으로 공유 메모리라고 하는 온칩 메모리를 효과적으로 활용해야 합니다. 본 논문의 접근 방식은 일반적인 CUDA 프로그래밍 패턴을 따릅니다. 1) VRAM(비디오 랜덤 액세스 메모리)에서 공유 메모리로 데이터를 로드하고, 2) 공유 메모리 내의 데이터에 대해 계산을 수행하고, 3) 공유 메모리에서 VRAM으로 결과를 다시 저장합니다. 적절한 동기화를 통해 이러한 단계 전반에 걸쳐 데이터 무결성이 유지됩니다.
인덱스 저장 방식
CPU에 비해 최신 GPU의 캐시 및 메모리 용량이 제한되어 있으므로 효율적인 인덱스 저장 체계를 사용하는 것이 중요합니다. 이렇게 하면 공유 메모리를 최대한 활용하고 더 큰 문제 크기를 관리하는 데 도움이 됩니다. 본 논문의 접근 방식은 셀 내 각 엔터티의 첫 번째 인덱스만 저장하고 이를 사용하여 벡터 항목을 공유 메모리에 직접 로드합니다. 그림 7은 2차 Raviart-Thomas 요소에 대한 이 인덱스 저장 방법을 보여줍니다.
커널 성능 및 최적화
다중 그리드 방법에서 연산자는 일반적으로 모든 셀(또는 정점 패치 스무더의 패치)을 반복하여 구현됩니다. 각 셀에서 수행되는 작업은 다른 셀의 작업과 독립적이므로 병렬 실행이 가능합니다. 각 셀 내에서 모든 자유도가 동시에 평가되므로 셀 간 통신이 필요하지 않습니다. 이러한 계산 패턴은 각 CUDA 스레드가 자유도에 해당하고 각 CUDA 스레드 블록이 셀에 해당하는 CUDA 프로그래밍 모델에 매우 적합합니다. 이 설정은 두 가지 수준의 병렬 처리를 용이하게 하여 계산 효율성을 향상시킵니다.
Stokes 연산자 커널
Stokes 연산자의 구현은 셀 단위 접근 방식을 기반으로 합니다. 면 항목은 인 соседних 셀의 정보가 필요하기 때문에 데이터는 패치 단위로 로드됩니다. 이러한 방식으로 각 셀에 대한 기여도와 면 적분의 일부를 계산하여 메시의 각 면이 한 번만 계산되도록 합니다. 입력 벡터는 공유 메모리에 로드되어 로컬 작업에서 임의의 긴 대기 시간 전역 메모리 액세스를 방지합니다. 그림 8에 표시된 결과는 각 최적화가 Stokes 연산자의 전반적인 성능에 미치는 영향을 보여줍니다. 아래에서는 각 커널에 대한 세부 정보와 해당 커널 내에 적용된 최적화를 제공합니다. Raviart-Thomas 요소의 이방성 특성으로 인해 행렬이 더 이상 정사각형이 아니므로 로컬 작업을 구현하기 위한 다른 접근 방식이 필요합니다.
패딩 커널: 이 커널에서는 1D 객체 및 매핑 데이터와 같은 상수 데이터가 상수 메모리에 저장됩니다. 계산을 위해 행렬을 채워 정사각형 구조를 복원합니다. 특히 직교 방향으로만 제로 패딩이 필요합니다. 이 방법은 간단하고 구현하기 쉽습니다. 그러나 단점도 있습니다. 패딩은 그림 1과 같이 직교 방향으로만 적용되지만 3차원 케이스에서는 여전히 상당한 영향을 미쳐 이미 상당한 공유 메모리 부담을 악화시킵니다. 또한 더 큰 차원의 행렬 계산으로 인해 도입된 추가 작업도 전반적인 성능에 영향을 미칩니다. 결과적으로 이 커널은 2.88TFLOPS/s에 불과합니다.
기본 커널: 이 커널에서는 스레드 수를 행렬 크기와 일치시키고 하나의 스레드가 3차원에서 하나의 "열" 자유도를 처리합니다. 이렇게 하려면 서로 다른 방향에 대한 해당 행렬 연산에 주의해야 합니다. 루프 경계에 템플릿 매개변수를 계속 사용할 수 있으므로 컴파일러가 루프를 완전히 롤아웃하고 작업을 다시 정렬하여 명령어 흐름을 개선할 수 있습니다. 이 커널은 최대 3.62TFLOPS를 달성하며, 이는 패딩 커널보다 25% 향상된 수치입니다.
공유 메모리 커널: 이전 커널과 달리 이 커널은 상수를 포함한 모든 데이터를 공유 메모리에 로드합니다. 상수 메모리에 액세스하는 것이 공유 메모리보다 빠르지만 상수 메모리 액세스에는 더 엄격한 제한이 있습니다. 워프의 모든 스레드가 동일한 주소에 액세스하는 경우에만 최적의 성능을 얻을 수 있습니다. 따라서 공유 메모리가 더 적합한 선택이며 이러한 접근 방식에서 성능이 향상됩니다.
충돌 없는 커널: 공유 메모리의 마지막 과제는 뱅크 충돌입니다. 이전 연구[9]를 기반으로 텐서 축약 작업의 순서와 공유 메모리의 데이터 레이아웃을 다시 정렬하여 구현을 통해 최적의 액세스 패턴을 보장합니다. 이를 통해 3.95TFLOPS/s에 도달하는 상당한 성능 향상을 얻을 수 있으며, 이는 배정밀도 최대 성능의 45%입니다.
루프라인 분석
기존의 루프라인 모델에서는 VRAM 대역폭을 제한 요소로 가정합니다. 그러나 공유 메모리를 광범위하게 사용하기 때문에 공유 메모리 대역폭이 실제 제한 요소라고 가정합니다. [33, 9, 8]에서 영감을 얻어 성능에 영향을 미치는 요소를 보다 정확하게 이해하기 위해 공유 메모리 대역폭에 특히 중점을 둔 루프라인 모델을 고려합니다. 공유 메모리의 대역폭은 다음 공식을 사용하여 추정할 수 있습니다.
B = #SM × #뱅크 × 단어 길이 × 클록 속도
NVIDIA A100 GPU의 경우 해당 대역폭은 108 · 32 · 4 · 1.27 = 17.145TB/s이며, 이는 [32]에 보고된 127.7바이트/clk/SM의 측정된 공유 대역폭과 일치합니다.
먼저 그림 8에서 패딩 커널이 가장 왼쪽에 나타나고 도입된 추가 제로 패딩으로 인해 FLOP/바이트 비율이 가장 낮다는 것을 알 수 있습니다. 기본 및 공유 메모리 커널은 산술 강도가 거의 동일하지만 뱅크 충돌이 발생하여 성능이 저하됩니다. 각 뱅크 충돌로 인해 새로운 메모리 트랜잭션이 추가로 발생합니다. 필요한 트랜잭션이 많을수록 스레드에서 액세스하는 단어와 함께 사용되지 않는 단어가 더 많이 전송되어 명령어 처리량도 감소합니다. 마지막으로 충돌 없는 커널은 성능을 크게 향상시켜 차수 k = 1, 2에 대해 최대 성능의 40%를 달성합니다. 이는 대규모 조밀 행렬-행렬 곱셈 1에서 달성되는 일반적인 90%보다 낮습니다. 이러한 성능 저하의 주요 이유는 전역 벡터에 대한 비정형 읽기/쓰기 액세스와 구형점에서의 작업으로 인해 부동 소수점이 아닌 명령어가 도입되고 명령어 파이프라인에 영향을 미치기 때문입니다. 고차 요소의 경우 공유 메모리를 과도하게 사용하면 달성된 점유율에 영향을 미쳐 성능이 눈에 띄게 저하됩니다. 하나의 스레드 블록만 스트리밍 멀티프로세서에 할당할 수 있으므로 성능이 저하됩니다. 이는 NVIDIA의 프로파일링 도구인 Nsight Compute [27]에서 확인되었습니다.
처리량 측면에서 알고리즘 성능 평가
TFLOPS/s는 연산자 평가의 실제 속도를 완전히 전달하지 못합니다. 알고리즘 성능을 더 잘 이해하기 위해 초당 자유도(DoF/s) 측면에서 처리량도 평가합니다. 그림 9에서 볼 수 있듯이 TFLOPS/s의 개선 사항은 DoF/s에도 반영되어 유사한 성능 패턴을 보이며 최상의 경우 최대 처리량이 2GDoF/s에 근접합니다. 또한 k = 3, 4의 경우 성능이 저하되는 것을 관찰할 수 있습니다. 공유 메모리 사용과 관련된 문제에도 불구하고 TFLOPS/s의 성능 향상은 DoF/s의 처리량 증가로 직접 전환되어 다양한 메트릭에서 최적화의 효과를 보여줍니다.
로컬 솔버 커널
또 다른 중요한 작업은 스무딩 연산자의 로컬 솔버입니다. 명시적 반전과 역행렬 곱셈(O(k2d) 작업 포함)을 방지하기 위해 3.2절에서 설명한 대로 Schur complement를 사용합니다. 또한 3차원 케이스의 경우 로컬 역행렬에 필요한 메모리가 164KB의 공유 메모리 용량을 쉽게 초과합니다. 그림 10에서 볼 수 있듯이 전역 메모리에 액세스하면 성능에 큰 영향을 미칩니다. Schur complement와 빠른 대각화를 함께 사용하면 모든 작업을 공유 메모리 내에서 완료할 수 있으므로 비교적 안정적인 성능을 얻을 수 있습니다. 마찬가지로 기본 작업이 텐서 곱이므로 4.1절에서 설명한 충돌 없는 커널 기술을 적용하여 뱅크 충돌을 제거할 수 있습니다. 그림 10에서 두 개의 Schur Complement 커널(충돌 없음 및 Schur Complement)을 비교해 보면 뱅크 충돌을 제거하면 성능이 최소 1.5배 향상되고 RT3에서는 거의 6배 향상됩니다. Stokes 연산자와 달리 충돌 없는 액세스 패턴은 반복적 방법을 사용하여 압력 성분을 해결하는 데 광범위한 텐서 곱 연산이 포함되기 때문에 Schur Complement 커널에 특히 중요합니다. 아래에서는 다항식 차수 k = 1, 3을 예로 들어 뱅크 충돌의 원인과 RT3에서 가장 두드러지는 이유를 분석합니다.
그림 11(a)에서는 각 행 내의 요소가 메모리에 연속적으로 저장되는 행 우선 저장 형식을 고려하여 (N +1)× Nd−1 행렬에 해당하는 재구성된 입력 벡터를 보여줍니다. 연산자 평가에는 다양한 형태의 행렬 곱셈을 의미하는 다양한 방향이 포함됩니다. 이 그림은 방향 2에서 작동할 때의 행렬-행렬 곱셈을 보여줍니다. 그림 11(b) 및 (c)는 각각 k = 1 및 k = 3에 대한 공유 메모리의 행렬 요소에 해당하는 뱅크 번호를 보여줍니다(배정밀도 고려, 16개 뱅크(단정밀도의 경우 32개 뱅크) 결과).
결론
본 논문에서는 Stokes 문제에 대한 매트릭스 없는 다중 그리드 방법을 제시했습니다. 이 방법은 Schur complement 방법과 빠른 대각화 방법을 결합하여 로컬 솔버를 효율적으로 평가합니다. 뱅크 충돌은 특히 공유 메모리를 사용할 때 GPU 컴퓨팅의 가장 중요한 문제 중 하나입니다. 이전 연구에서 개발한 방법을 적응시켜 충돌 없는 메모리 액세스 패턴을 설계하여 성능을 크게 향상시켜 10억 개 이상의 자유도를 달성했습니다. 제안된 방법은 3차원에서 포아송 문제에 대한 다중 그리드 방법의 효율성에 필적하는 뛰어난 수렴 속도를 달성합니다. 또한 이 방법은 GPU에서 구현하기에 매우 적합하며, 여기서 뱅크 충돌을 제거하고 공유 메모리를 효율적으로 사용하면 상당한 성능 향상을 얻을 수 있습니다.
통계
단일 NVIDIA A100 GPU에서 초당 10억 개 이상의 자유도를 달성했습니다.
3차원에서 포아송 문제에 대한 다중 그리드 방법의 효율성에 필적하는 뛰어난 수렴 속도를 달성했습니다.
뱅크 충돌을 제거하면 성능이 최소 1.5배 향상되고 RT3에서는 거의 6배 향상됩니다.