核心概念
GPU와 CPU 아키텍처에 대한 포터블하고 효율적인 코드 구조를 제공하는 방법을 제시한다. Alya의 비압축성 유동 모듈에서 우변 항 조립 부분을 최적화하여 GPU에서 50배 이상의 성능 향상을 달성했다.
摘要
이 논문은 CPU와 GPU 아키텍처에 대한 포터블하고 효율적인 코드 구조를 제공하는 방법을 다룬다. 구체적으로 Alya의 비압축성 유동 모듈에서 우변 항 조립 부분을 최적화하였다.
초기 OpenACC 기반 GPU 포팅 버전은 CPU 대비 4-5배 느린 성능을 보였다. 이를 개선하기 위해 다음과 같은 조치를 취했다:
- 중간 값 수명 최적화를 통한 코드 구조 재구성
- 특정 요소 유형과 수치 처리 방식에 특화
- 중간 결과 배열을 스칼라 지역 변수로 대체
이러한 조치를 통해 GPU 성능을 50배 이상 향상시켰다(약 2.5 TF/s FP64). CPU 성능도 5배 향상되었다(약 1.0 TF/s FP64).
이 연구 결과는 Alya와 다른 응용 프로그램의 관련 커널에 대해 통일된 but 여전히 효율적인 코드 구조를 구현하는 데 활용될 수 있다. 이는 수동 코딩 또는 자동 코드 생성 프레임워크를 통해 실현될 수 있다.
统计
CPU에서 1코어 당 약 14.2 GFlop/s의 성능을 달성했다.
CPU에서 1코어 당 약 2.5 GB/s의 메모리 대역폭을 달성했다.
GPU에서 약 2.6 TFlop/s의 성능을 달성했다.
GPU에서 약 289 GB/s의 메모리 대역폭을 달성했다.
引用
"GPU 포팅 접근법은 대규모 코드베이스의 이식에 중요한 역할을 해왔지만, 포팅된 코드의 효율성은 최적이 아닐 수 있다."
"CPU와 GPU 타겟은 매우 다른 실행 특성과 문제, 최적화 요구사항을 가지고 있다."
"최적화 분석과 작업은 개별적으로 수행되어야 하지만, 두 타겟에 대한 합리적인 성능 절충점을 가진 통일된 코드베이스의 실현 가능성을 배제하지 않는다."