openfoamのメニーコア・ gpuへの対応に向けた …rapidcfd改善の余地について...

20
OpenFOAMのメニーコア・ GPUへの対応に向けた 取り組みの紹介 オープンCAEシンポジウム2017 2017年12月9日 名古屋大学 山岸孝輝 井上義昭 青柳哲雄 浅見曉 (高度情報科学技術研究機構) 1 ver 1.1

Upload: others

Post on 02-Jun-2020

4 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: OpenFOAMのメニーコア・ GPUへの対応に向けた …RapidCFD改善の余地について OpenFOAMのversionが古い 最新の5.0よりも約3年前のもの ThrustライブラリでのGPU実装

OpenFOAMのメニーコア・GPUへの対応に向けた

取り組みの紹介オープンCAEシンポジウム2017

2017年12月9日 名古屋大学

山岸孝輝 井上義昭 青柳哲雄 浅見曉(高度情報科学技術研究機構)

1ver 1.1

Page 2: OpenFOAMのメニーコア・ GPUへの対応に向けた …RapidCFD改善の余地について OpenFOAMのversionが古い 最新の5.0よりも約3年前のもの ThrustライブラリでのGPU実装

OpenFOAMとGPU・メニーコア

GPU:NVIDIA GPU実装に手間+性能出すのは大変simFlow社によるGPU実装版(RapidCFD)

リリースは3年前、最後のbug fixは2年前

メニーコア:Intel Xeon Phi KNL移植は比較的楽(Intelコンパイラ, MPI)性能については試行錯誤の段階

2

Githubでソースコード公開https://github.com/Atizar/RapidCFD-dev

Page 3: OpenFOAMのメニーコア・ GPUへの対応に向けた …RapidCFD改善の余地について OpenFOAMのversionが古い 最新の5.0よりも約3年前のもの ThrustライブラリでのGPU実装

RapidCFD性能評価事例

3

simFlow社ウェブサイトから引用

4GPUから性能が鈍化

複数GPUでのスケーリング性能

RapidCFD高速化@TSUBAME 3.0について紹介

GPU数

加速率

Page 4: OpenFOAMのメニーコア・ GPUへの対応に向けた …RapidCFD改善の余地について OpenFOAMのversionが古い 最新の5.0よりも約3年前のもの ThrustライブラリでのGPU実装

TSUBAME 3.0 測定環境項目 内容

HW TSUBAME 3.0 SGI ICE XACPU Xeon E5-2680v4[426GF, 2.4GHz, 14core], 2socketGPU Tesla P100 with NVLink[5.3TF, 16GB], 4boardノード間接続 Intel Omni-Path 100Gb/s x4

SW C++ Icc 17.0.4MPI OpenMPI 2.1.1CUDA CUDA 8.0.61

AP OpenFOAM 2.3.0RapidCFD 2.3.1+ThrustライブラリによるGPU実装解析ソルバ pisoFoam

解析データ (1)弱スケーリング 192x128x128 or 128x128x128 cells/processor~

4

Page 5: OpenFOAMのメニーコア・ GPUへの対応に向けた …RapidCFD改善の余地について OpenFOAMのversionが古い 最新の5.0よりも約3年前のもの ThrustライブラリでのGPU実装

解析モデル(弱スケーリング)16m 3m

2m風洞測定部

200万格子/GPU or CPU で一定(弱スケーリング)

GPU or CPU 格子数

1 128x128x128 200万

2 256x128x128 400万

4 512x128x128 800万

8 256x256x256 1600万

16 512x256x256 3200万

5理想的には性能(経過時間)はスケール(一定)

1プロセッサあたり200 or 300万格子を設定

200万格子での設定

Page 6: OpenFOAMのメニーコア・ GPUへの対応に向けた …RapidCFD改善の余地について OpenFOAMのversionが古い 最新の5.0よりも約3年前のもの ThrustライブラリでのGPU実装

CPU vs GPU(ASIS)

6同世代のCPUに比べて3.3倍高速

44.4

13.3 0

10

20

30

40

50

CPU GPU

300万格子/1GPU or 1CPU

CPUは12コアでflat MPI

プロセッサ単体での性能

3.3倍

[秒]

CPU:E5-2680v4GPU:P100

Page 7: OpenFOAMのメニーコア・ GPUへの対応に向けた …RapidCFD改善の余地について OpenFOAMのversionが古い 最新の5.0よりも約3年前のもの ThrustライブラリでのGPU実装

GPU 弱スケーリング性能(ASIS)

7GPUのノード内並列で性能劣化 4GPUで2倍低速

2種類のGPU配置方法で計測(1→4GPU)

10.6 14.9

23.2

0

5

10

15

20

25

1 2 4

10.6 11.5 12.1

0

5

10

15

20

25

1 2 4

X4ノード内並列

ノード間並列

200万格子/1GPU[秒] [秒]

GPU数 GPU数

Page 8: OpenFOAMのメニーコア・ GPUへの対応に向けた …RapidCFD改善の余地について OpenFOAMのversionが古い 最新の5.0よりも約3年前のもの ThrustライブラリでのGPU実装

処理プロセスごとに分類して計測

8

0.1 0.1 0.1

6.0 8.4

13.5 0.7

1.0

1.5

0.8

1.0

1.5

1.5

2.1

3.6

1.1

1.6

2.1

0.2

0.3

0.4

0

5

10

15

20

25

1 2 4

othersUEqn.2UEqn.3UEqn.4PISO.2pEqn.2pEqnpEqn.3pEqn.4

ノード内並列

[秒]

GPU数

メインループでの分類

Page 9: OpenFOAMのメニーコア・ GPUへの対応に向けた …RapidCFD改善の余地について OpenFOAMのversionが古い 最新の5.0よりも約3年前のもの ThrustライブラリでのGPU実装

ソースコード解析 性能阻害箇所template<>scalar sumProd(const gpuList<scalar>& f1, constgpuList<scalar>& f2){

if (f1.size() && (f1.size() == f2.size())){

thrust::device_vector<scalar> t(f1.size());

thrust::transform(

f1.begin(),f1.end(),f2.begin(),t.begin(),multiplyOperatorFunctor<scalar,scalar,scalar>()

);

return thrust::reduce(t.begin(),t.end());}

else{

return 0.0;}

}総和計算(thrustライブラリ実装)

9

総和計算処理にて性能が悪化と判明

Page 10: OpenFOAMのメニーコア・ GPUへの対応に向けた …RapidCFD改善の余地について OpenFOAMのversionが古い 最新の5.0よりも約3年前のもの ThrustライブラリでのGPU実装

Visual Profilerによる詳細分析

10

マイクロ秒単位

カーネル・APIレベル

タイムラインを追う

4GPU時

1GPU時

cudaMalloc reduce

cudaMalloc cudaFreereduce

GPU上のメモリ確保・解放のコストがGPU数につれて増大GPU上のメモリ確保・解放のコストがGPU数につれて増大

cudaFree

CUDAによる実装Malloc/Freeの除去へ

Page 11: OpenFOAMのメニーコア・ GPUへの対応に向けた …RapidCFD改善の余地について OpenFOAMのversionが古い 最新の5.0よりも約3年前のもの ThrustライブラリでのGPU実装

44.4

13.3 10.1 0.05.0

10.015.020.025.030.035.040.045.050.0

CPU GPU ASIS GPU TUNED

CPU vs GPU(TUNED)

11

プロセッサ単体での性能

3.3倍 → 4.4倍 高速に

4.4倍

300万格子/1GPU or 1CPU

CPUは12コアでflat MPI

3.3倍

1.3倍

[秒]

Page 12: OpenFOAMのメニーコア・ GPUへの対応に向けた …RapidCFD改善の余地について OpenFOAMのversionが古い 最新の5.0よりも約3年前のもの ThrustライブラリでのGPU実装

GPU 弱スケーリング性能(TUNED)

多数GPU設定(4, 8, 16)にて2倍改善12

1ノード4GPU30.7 31.2 31.6

34.0 32.2

10.6

14.9

23.2 24.4 24.9

7.2 9.0

12.0 13.1 13.2

0.0

5.0

10.0

15.0

20.0

25.0

30.0

35.0

40.0

1 2 4 8 16

CPUGPU ASISGPU TUNED

200万格子/1GPU

[秒]

GPU数

Page 13: OpenFOAMのメニーコア・ GPUへの対応に向けた …RapidCFD改善の余地について OpenFOAMのversionが古い 最新の5.0よりも約3年前のもの ThrustライブラリでのGPU実装

RapidCFD 改善の余地についてOpenFOAMのversionが古い

最新の5.0よりも約3年前のものThrustライブラリでのGPU実装

柔軟な最適化が難しいコンピュートケイパビリティが3.0に設定プロファイラ結果の解析が困難

Time(%) Time Calls Avg Min Max Name0.47% 50.343ms 21318 2.3610us 1.6960us 49.216us Foam::reduce_C_5(double*,double*,int)

13

Time(%) Time Calls Avg Min Max Name0.47% 50.761ms 523 97.057us 5.3120us 1.0682ms void thrust::system::cuda::detail::bulk_::detail::launch_by_value<unsigned

int=0, thrust::system::cuda::detail::bulk_::detail::cuda_task<thrust::system::cuda::detail::bulk_::parallel_group<thrust::system::cuda::detail::bulk_::concurrent_group<thrust::system::cuda::detail::bulk_::agent<unsigned long=1>, unsigned long=0>, unsigned long=0>, thrust::system::cuda::detail::bulk_::detail::closure<thrust::system::cuda::detail::for_each_n_detail::for_each_kernel, thrust::tuple<thrust::system::cuda::detail::bulk_::detail::cursor<unsigned int=0>, thrust::zip_iterator<thrust::tuple<thrust::detail::normal_iterator<thrust::device_ptr<Foam::Vector<double> const >>, thrust::detail::normal_iterator<thrust::device_ptr<Foam::Vector<double> const >>, thrust::detail::normal_iterator<thrust::device_ptr<double>>, thrust::null_type, thrust::null_type, thrust::null_type, thrust::null_type, thrust::null_type, thrust::null_type, thrust::null_type>>, thrust::detail::wrapped_function<thrust::detail::binary_transform_functor<Foam::dotOperatorFunctor<Foam::Vector<double>, Foam::Vector<double>, double>>, void>, unsigned int, thrust::null_type, thrust::null_type, thrust::null_type, thrust::null_type, thrust::null_type, thrust::null_type>>>>(unsigned long=1)

CUDA

Thrust

Page 14: OpenFOAMのメニーコア・ GPUへの対応に向けた …RapidCFD改善の余地について OpenFOAMのversionが古い 最新の5.0よりも約3年前のもの ThrustライブラリでのGPU実装

新しいGPU版OpenFOAM開発へ

最新のOpenFOAMをベースにして開発の方針、特徴

GPU実装はすべてCUDAGPUDirect RDMA転送に対応

目標高速な大規模実行の実現GPUを用いた大規模アプリに適用しうる知見の蓄積

14

Page 15: OpenFOAMのメニーコア・ GPUへの対応に向けた …RapidCFD改善の余地について OpenFOAMのversionが古い 最新の5.0よりも約3年前のもの ThrustライブラリでのGPU実装

メニーコア:Intel Xeon Phi KNL

15

項目 内容HW KNL搭載PCクラスタ CX6000M1/CX1640M1x4

ノード数 4モード設定 flat/cache/MCDRAM + Quadrant/AlltoAll/SNC2/SNC4CPU Intel Xeon Phi 7250[3TFLOPS, 1.4GHz, 68core]

Intel Omni-PathSW C++/Fortran Icc 17.0.1

MPI Intel MPI 2017 update 1コンパイルオプション -O3 -xMIC-AVX512

AP OpenFOAM 2.3.1(RIST最適化版)解析ソルバ pimpleFoam

解析データ 強スケーリング 240x130x96 cells/1-64processros

OpenFOAMの基礎調査としてRIST所有のKNL搭載PCクラスタ

(4ノード)で性能評価

Page 16: OpenFOAMのメニーコア・ GPUへの対応に向けた …RapidCFD改善の余地について OpenFOAMのversionが古い 最新の5.0よりも約3年前のもの ThrustライブラリでのGPU実装

メモリ モード変更

16

OpenFOAM 2.3.1 channelReTau110

メモリモード変更(DRAM→cache/MCDRAM)でメモリモード変更(DRAM→cache/MCDRAM)で3倍弱高速に

DRAMDRAM cachecache MCDRAMMCDRAM PCG,前処理DIC

DRAM設定時、並列数を増加させると演算処理部の時間が急増、スケーリング性能劣化(要求メモリバンド幅大)

1ノード内並列数の増加(16/32/64PE)

https://github.com/opencae/OpenFOAM-BenchmarkTest

参考:京

Page 17: OpenFOAMのメニーコア・ GPUへの対応に向けた …RapidCFD改善の余地について OpenFOAMのversionが古い 最新の5.0よりも約3年前のもの ThrustライブラリでのGPU実装

クラスターモード+Hyper-threading

17

• All-to-all (a2a): Uniform mesh interconnect

• Quadrant (quad): Four virtual address spaces (one NUMA domain)

• Sub-NUMA-2 (snc2): Two distinct NUMA domains

• Sub-NUMA-4 (snc4): Four distinct NUMA domains

KNLでの最速クラスターモード及びHyper-threading効果を検証

全て 1node

各種モード(quad,a2a,snc2or4/flat,cache等)×Hyper-threading

最速:snc2/flat+128mpi[64corex2HT]最大で17%のコスト削減

HT 2HT無 HT 4

Page 18: OpenFOAMのメニーコア・ GPUへの対応に向けた …RapidCFD改善の余地について OpenFOAMのversionが古い 最新の5.0よりも約3年前のもの ThrustライブラリでのGPU実装

マルチノード+HyperThreading

18

(HT:x2) (x2) (x4) (x2)

Mc: McDramHT:HyperThreadxN(スレッド数)

KNL/4node構成(quad, cacheモード)

1-4ノードまで クラスターモード、HTに依存せずスケール

2ノード1ノード 4ノード

参考:京総格子数300万

Page 19: OpenFOAMのメニーコア・ GPUへの対応に向けた …RapidCFD改善の余地について OpenFOAMのversionが古い 最新の5.0よりも約3年前のもの ThrustライブラリでのGPU実装

まとめRapidCFDの性能評価と最適化

総和計算をCUDA実装→無駄なメモリ確保・解放コストを削減GPU単体では3.3→4.4倍高速に(CPU比較)複数GPUでのスケーリング性能は最大で2倍改善新しいGPU版OpenFOAM開発へ

KNL4ノードでのOpenFOAMの性能評価メモリモード変更(DRAM→cache/MCDRAM)で3倍弱高速にクラスターモード・HTの設定は最大で17%影響4ノードまではクラスターモード・HTの設定に依存しないでスケーリング

19

Page 20: OpenFOAMのメニーコア・ GPUへの対応に向けた …RapidCFD改善の余地について OpenFOAMのversionが古い 最新の5.0よりも約3年前のもの ThrustライブラリでのGPU実装

謝辞本発表の内容は,HPCIシステム利用研究課題「流体・粒子の大規模連成解析を用いた竜巻中飛散物による建物被害の検討(課題番号:hp170055),課題代表者:菊池浩利(清水建設(株)技術研究所)」の高度化支援に基づくものです.

20