개발/CFD

Fortran DNS 푸아송 솔버 성능 분석 및 최적화

섭교수 2025. 9. 3. 16:09
반응형
Fortran DNS 푸아송 솔버 성능 분석

Fortran DNS 푸아송 솔버 성능 분석 및 최적화

계산 속도 향상을 위한 다각적 접근

개요: 코드의 목적과 접근 방식

제공된 Fortran 코드는 전산유체역학(CFD) 분야의 직접 수치 모사(DNS)에서 핵심적인 부분인 푸아송 방정식(Poisson Equation)을 해결하기 위한 고성능 솔버입니다. 이 코드는 z-방향으로 균일한 격자를 가정하여 계산 효율을 극대화하는 독창적인 하이브리드 접근법을 사용합니다. z-방향으로는 고속 푸리에 변환(FFT)을 적용하여 3차원 문제를 2차원 헬름홀츠 방정식(Helmholtz equations)의 집합으로 변환합니다. 변환된 각 2차원 문제는 x-방향으로 멀티그리드(Multigrid) 기법을, y-방향으로는 TDMA(Tri-Diagonal Matrix Algorithm)를 결합하여 해결합니다. 이 구조는 OpenMP를 통해 공유 메모리 시스템에서 병렬화되어 계산 속도를 높입니다. 본 분석의 목표는 이 정교한 솔버의 성능을 한 단계 더 끌어올릴 수 있는 방안을 모색하는 것입니다.

코드 분석: 솔버 워크플로우

솔버는 `POISSON` 서브루틴을 중심으로 다음과 같은 3단계 워크플로우를 통해 해를 구합니다.

📥

입력

`DIVGSUM` (속도 발산 항)

⚙️

계산 과정

  1. Forward FFT (z-축): 3D 데이터를 2D 데이터 집합으로 변환
  2. 2D Solver (x-y 평면): 각 파수(wavenumber)에 대해 `MG2D` 또는 `GSOR2D` 호출
  3. Inverse FFT (z-축): 계산된 2D 해를 다시 3D 공간으로 변환
📤

출력

`PHI` (유사 압력)

성능 병목: 어디가 느릴까?

1. FFT 라이브러리

코드에 포함된 `FFTE` 라이브러리는 2004년 버전으로, 최신 CPU의 SIMD 명령어(AVX 등)나 캐시 구조에 최적화되어 있지 않을 가능성이 높습니다. FFT는 계산 집약적이므로 이 부분이 전체 성능을 크게 좌우할 수 있습니다.

2. 병렬화 모델의 한계

OpenMP는 단일 노드(shared memory) 환경에서만 작동합니다. 더 큰 규모의 시뮬레이션을 위해 여러 노드로 확장하려면 MPI와 같은 분산 메모리 병렬화 모델이 필요합니다. 현재 구조로는 스케일업에 명확한 한계가 존재합니다.

3. 메모리 접근 패턴

다차원 배열을 처리하는 과정, 특히 FFT 전후의 데이터 재배열(`ZTRANSMUL`) 단계에서 캐시 비효율성(cache miss)이 발생할 수 있습니다. Fortran의 열 우선(column-major) 저장 방식을 고려한 최적의 루프 구성이 아닐 경우 성능 저하가 일어납니다.

4. 하드웨어 활용

푸아송 솔버와 같은 규칙적인 격자 기반의 계산은 GPU에서 엄청난 성능 향상을 기대할 수 있습니다. 현재의 CPU 기반 코드는 최신 가속기 하드웨어의 잠재력을 완전히 활용하지 못하고 있습니다.

최적화 전략: 어떻게 빠르게 할까?

전략: 최신 FFT 라이브러리 교체

가장 빠르고 확실한 성능 향상 방법은 내장된 `FFTE`를 최신 고성능 라이브러리로 교체하는 것입니다. FFTW(Fastest Fourier Transform in the West)Intel MKL은 최신 CPU 아키텍처에 완벽하게 최적화되어 있어, 코드 변경을 최소화하면서도 상당한 속도 향상을 기대할 수 있습니다.

적용 방법

  1. 시스템에 FFTW 또는 MKL 라이브러리를 설치합니다.
  2. 컴파일 시 해당 라이브러리를 링크합니다. (예: `-lfftw3`)
  3. 기존 `CALL ZFFT1D(...)` 부분을 새로운 라이브러리의 호출 규격에 맞게 수정합니다. FFTW의 경우, plan을 생성하고 실행하는 2단계 접근이 필요합니다.

현대화 로드맵

다음은 제안된 최적화 전략을 적용하기 위한 단계별 로드맵입니다.

1

Phase 1: 라이브러리 교체

단기 (1-2주)

FFTE를 FFTW/MKL로 교체하여 즉각적인 성능 향상을 확보합니다. (ROI가 가장 높음)

예상 성능 향상: 2x ~ 5x

2

Phase 2: MPI 도입

중기 (1-3개월)

MPI를 추가하여 멀티-노드 환경으로 확장성을 확보하고 더 큰 규모의 문제에 대응합니다.

예상 성능 향상: 노드 수에 비례

3

Phase 3: GPU 포팅

장기 (6개월+)

최고의 성능을 위해 코드를 CUDA/OpenACC로 재작성하고 cuFFT, AmgX 등의 GPU 라이브러리를 활용합니다.

예상 성능 향상: 10x ~ 50x+

© 2025 AI-Powered Code Performance Analysis. All Rights Reserved.

반응형