GDEP Solutions, Inc.
  • Home
    • 新着情報一覧
    • NVIDIA NEWS
    • GPU2021 開催概要 >
      • Day1 AI & GPU セッション
      • Day2 イメージングAI
      • Day3 GPUスパコン
      • 講演レポート | Denso
      • 過去開催 >
        • GPU2020
        • GPU2019
  • GPU製品
    • 即納モデル
    • NVIDIA GPU 一覧 >
      • NVIDIA H100
      • NVIDIA A100
      • NVIDIA RTX スペック比較 >
        • NVIDIA RTX A6000
        • NVIDIA RTX A5000
        • NVIDIA RTX A4500
        • NVIDIA RTX A4000
        • NVIDIA RTX A2000
      • Quadro GV100
    • GPUレンタル一覧
    • GPU年定額プラン
    • AI・データサイエンスおすすめ一覧 >
      • NVIDIA DGX H100
      • NVIDIA DGX A100
      • DGX STATION A100
      • HP Z8 G4 Workstation
      • HP ZBook Fury17G7 Mobile Workstation
      • Dell Precision 7920 Tower
      • DeepLearning BOXⅡ
      • DeepLearning STATION
      • NVIDIA EGX サーバー
      • HITACHI SR24000
    • 数値計算・解析おすすめ一覧 >
      • HP Z4 G4 Workstation
      • HP Z8 G4 解析ソフトウェア動作確認済みモデル
      • Supermicro 7049GP
    • NVIDIA A100搭載 Supermicro 740GP
  • ストレージ
    • Synology
    • DDN STORAGE
    • PURESTORAGE
  • HPC
    • HPC Workstation
    • HPCおすすめGPUサーバー
    • HPC SIサービス
    • AXXE-L by XTREME-D
    • NVIDIA HPC SDK
    • プログラム高速化サービス
  • クラウド製品
    • セキュリティ >
      • KernelCare
    • 仮想化 >
      • Login VSI
      • Login PI
    • リモートアクセス >
      • FastX
      • NiceDCV
      • NoMachine
    • ハイブリッドクラウドNAS >
      • Morro Data
    • クラウドストレージ >
      • クラウドストレージ Wasabi
  • GPUコラム / 導入事例
    • GPUプログラミング >
      • 初級編
      • 中級編 >
        • 第4回:MPI+OpenACC実装における計算と通信のオーバーラップ
        • 第3回:拡散現象シミュレーションのおさらい
        • 第2回:簡単なOpenACC + MPI コードで考える
        • 第1回:複数のGPUを使う方法とは?
    • GPU Technology for CG/AI >
      • 深層学習を利用した画像処理・必要なGPU性能
      • トランスフォーマー 最近流行のニューラルネットワーク
      • GAN Inversion による写実的画像生成の制御
      • 深層学習におけるアノテーションコストを抑えるための取り組み Active Learning
      • 深層学習に基づく人物画像の再照明
      • GPUの起源と進化
      • AlphaGo とその後
      • CUDAを用いたシンプルなパストレーシング
      • 流体シミュレーションの応用
      • GPUを用いた高速レンダリング
      • GPUを基盤としたCG/AIの技術進化
    • シリコンバレー発信 New Technology Report >
      • 最新記事から
    • ツブ子が聞く・見る・行く! >
      • 見る!NVIDIA RTX A6000
      • 聞く!NVIDIA DGX A100
      • 見る!NVIDIA A100 Tensor Core GPU
    • 導入事例 >
      • DGX SYSTEMS >
        • NVIDIA DGX A100 | 金沢大学
      • GPU Computing
  • 会社情報
    • ごあいさつ
    • 会社概要
    • アクセスマップ
    • 採用情報
  • お問い合わせ

OpenACCではじめるGPUプログラミング

中級編 第3回

画像

第3回:拡散現象シミュレーションのおさらい

12/20/2021

 
前回はMPI + OpenACCによる簡単な計算を取り上げました。

​今回は、入門編で取り上げた拡散方程式プログラムの複数GPU実行について考えてみましょう。
​今回扱うコードも全てgithub上で公開されています。https://github.com/hoshino-UTokyo/lecture_openacc_mpi.git

拡散現象シミュレーションのおさらい

画像
図1:インクの拡散現象のシミュレーション
画像
図2:計算格子とタイムステップ
画像
図3:2次元拡散方程式と離散化の例
以前も取り上げた、拡散現象のシミュレーションプログラムの複数GPU実行を考えてみます。

​拡散現象とは、例えば図1のようにコップに垂らしたインクが拡散して、最終的に均一になる現象です。
このシミュレーションを行うには、図2のようにコップの中の空間を格子状に区切って、タイムステップを刻みながら格子の値を更新していくのでした。

値の更新は図3のように、自身とその周辺の格子の値を参照して計算します。
複数GPUで計算する場合、この「周辺の格子を参照する」という計算パターンが問題となります。

​例えば図4のように各GPUの担当場所を決めると、境界の格子点を更新する場合には、隣のGPUが持つデータを必要とするわけです。この、「別GPUからデータを持ってくる」をどうやって実現するのかが、マルチGPUプログラミングの最も重要な点になるわけです。
画像
図4:複数GPUによる格子点の領域分割イメージ。
GPU間のデータ通信を実現する方法がまさに、前回紹介したOpenACC + MPIなのです。

MPIで複数GPUを使う実装を考えてみましょう。
まずは、前回の記事で説明したように、MPIのランク番号とGPUの番号の対応付けが必要です。

​図5のように、acc_get_num_devices() と acc_set_device_num() を使います。
ここで変数rankはMPIのランク番号です。48行目はちょっとわかりづらいですが、ngpusが0か否か、つまりノードにGPUが有るか無いかで場合分けをしています。

​GPUが無い場合には50行目は実行されません。GPUがある場合には、rank番号をGPU数で割った余りがgpuidに代入されます。
画像
図5:MPIプロセスとGPU番号の対応付け。
​lecture_openacc_mpi/C/openacc_mpi_diffusion/02_openacc/main.cの一部
拡散方程式のカーネルを複数GPUで実行する上で、必要になる度に隣のGPUからデータを持ってくるのでは遅いので、あらかじめデータを置いておけるよう、図6のように上下に袖領域と呼ばれるのりしろを付けながら領域分割をします。

図6は二次元的に表現していますが、Z軸方向に担当領域を分割しています。
図中のnzは、本来のサイズであるnz0をMPIのプロセス数で割った数です。これに上下の袖領域の幅を加えて、領域f, fnを確保します(図7)。
​領域をf, fnと2つ確保するのは、図2のように配列を切り替えながらタイムステップを進めるためでした。
画像
図6:袖領域付きの領域分割とMPIによる袖領域交換の例。
画像
図7:袖領域付きの領域確保。
​lecture_openacc_mpi/C/openacc_mpi_diffusion/02_openacc/main.cの一部
次は拡散方程式のカーネル部分について考えてみます。

OpenACC化の手順は1GPUの場合と同じで、kernels指示文とloop指示文を用いて実装します(図8)。
袖領域付きの領域分割を行ったことで、26行目の配列インデックスの計算部分に、袖領域幅の変数mgnが現れています。

インデックス計算時にk+mgnとすることで、袖部分を飛ばして内側の点から計算を始めます。また27-32行目は境界部分の処理ですが、31, 32行目のZ方向の境界条件判定が複雑になっています。

​図6を見るとわかるように、k==0のz軸の上端の処理が必要なのはGPU 0 の時だけ、k==nz0-1のz軸の下端の処理が必要なのはGPU 2の時だけなので、MPIのランク番号のrankと総プロセス数のnprocsを用いて場合分けを行います。それ以外の場合には、自身の持つ袖領域の値を参照して計算するわけです。
画像
図8:拡散方程式カーネルのMPI+OpenACC実装。lecture_openacc_mpi/C/openacc_mpi_diffusion/02_openacc/diffusion.cの一部
ただし、図8で参照される袖領域の値は、本来隣のGPUが持っているデータですので、あらかじめ隣のGPUからMPIによって持って来ておく必要があります。

図6の袖領域交換を実装した部分を図9に示します。111-115行目で行っているMPI通信が、袖領域の交換です。
118行目のdiffusion3d関数(図8)の前に袖領域交換を行います。

​図9の実装例ではcuda-aware MPIを前提としており、前回解説したhost_data指示文を使うことでGPU上のfのアドレスをMPI関数に渡しています。インデックスの計算が少々面倒ですが、111,112行目のMPI_Send/Recvでは図6の青紫の袖領域通信を、114,115行目では図6の赤紫の袖領域通信を行っています。
画像
図9:CUDA-aware MPIを用いたMPIによる袖領域通信。lecture_openacc_mpi/C/openacc_mpi_diffusion/02_openacc/main.cの一部
それではこの実装の性能を計測してみましょう。
計測にはA100 GPUがノード当たり8枚搭載された、東京大学情報基盤センターのWisteria-BDEC/01のAquariusノードを利用します。

​結果は図10です。4GPUまでは順調に速くなっていますが、8GPUで遅くなってしまっていますね。
​次回は性能改善について考えてみます。
画像
図10:A100 GPU 8枚を用いた性能評価。

< 1ヵ月間有効のスパコンお試しアカウント >
​

東京大学情報基盤センターでは、教育の一環として、制限はあるものの一ヵ月の間有効なスパコンアカウントを提供しています。
現在3つのスパコンが運用されていますが、そのうちReedbushと呼ばれるスパコンには、一世代前のものではありますがGPUが搭載されていて、OpenACCを使える環境も整っています。
自分でどんどん自習したい場合は、ご利用を考えてみてください。

トライアルアカウント申し込みページ
https://www.cc.u-tokyo.ac.jp/guide/trial/free_trial.php

< 過去の講習会の資料やプログラム公開中 >
東大センターが行った過去のOpenACCに関する講習会の資料やプログラムも公開されていますので、自習する場合にはぜひご利用ください。

講習会ページ ※オンライン講習会 定期開催中!
https://www.cc.u-tokyo.ac.jp/events/lectures/

講習会で用いているプログラム
https://www.dropbox.com/s/z4fmc4ibdggdi0y/openacc_samples.tar.gz?dl=0​

    著者

    東京大学
    助教 星野 哲也 先生
    <略歴>
    ​​2016年~現在:東京大学
    情報基盤センター
    スーパーコンピューティング研究部門 助教
    2018年:東京工業大学
    ​大学院情報理工学研究科 数理・計算科学専攻 博士課程修了 博士(理学)

    アーカイブ
    中級編
    第4回(2022年2月)
    第3回(2021年12月)
    ​第2回(2021年9月)
    ​第1回(2021年7月)
    初級編 もくじ ≫
    ​中級編 もくじ ≫

    RSS フィード

Picture
GDEPソリューションズ株式会社
東京都文京区本郷三丁目34番3号 本郷第一ビル8階
TEL:03-5802-7050
・NVIDIA認定 Elite Partner [最上位レベル]
・NVIDIA Advanced Technology Program 達成  [DGX 販売資格]
・東京都公安委員会 古物営業許可番号
 第305471905562号
≫ 新着情報
≫ GPU2021開催概要
​
GPU製品
​≫ 即納モデル
≫ NVIDIA GPU一覧
 ≫NVDIA RTX スペック比較

≫ GPUレンタル一覧
≫ GPU年定額プラン
≫ AI・データサイエンスおすすめ
≫ 数値計算・解析おすすめ一覧
≫ NVIDIA A100搭載 SM740GP


​ストレージ
​≫ Synology
≫ DDN STORAGE
≫ PURESTORAGE
​
HPC
≫ HPC Workstation
≫ HPCおすすめGPUサーバー
≫ AXXE-L by XTREME-D
≫ NVIDIA HPC SDK
≫ プログラム高速化サービス
クラウド製品
​≫ セキュリティ
≫ 仮想化
≫ リモートアクセス

≫ ハイブリッドクラウドNAS
≫ クラウドストレージ
​
​GPUコラム
≫ GPUプログラミング入門
≫ GPU Technology for CG/AI
≫ シリコンバレー発信 New Technology Repot
≫ ツブ子が聞く・見る・行く
​

導入事例
≫ DGX SYSTEMS
≫ GPU Computing
会社情報
≫ ごあいさつ
≫ 会社概要
≫ アクセスマップ
≫ 採用情報
​
≫ お問い合わせ
​
≫ 個人情報の取扱いについて
≫ 利用規約

​
≫ メルマガを購読する
グループ会社
Prometech Softwareサイト
©2021 GDEP Solutions,Inc.
  • Home
    • 新着情報一覧
    • NVIDIA NEWS
    • GPU2021 開催概要 >
      • Day1 AI & GPU セッション
      • Day2 イメージングAI
      • Day3 GPUスパコン
      • 講演レポート | Denso
      • 過去開催 >
        • GPU2020
        • GPU2019
  • GPU製品
    • 即納モデル
    • NVIDIA GPU 一覧 >
      • NVIDIA H100
      • NVIDIA A100
      • NVIDIA RTX スペック比較 >
        • NVIDIA RTX A6000
        • NVIDIA RTX A5000
        • NVIDIA RTX A4500
        • NVIDIA RTX A4000
        • NVIDIA RTX A2000
      • Quadro GV100
    • GPUレンタル一覧
    • GPU年定額プラン
    • AI・データサイエンスおすすめ一覧 >
      • NVIDIA DGX H100
      • NVIDIA DGX A100
      • DGX STATION A100
      • HP Z8 G4 Workstation
      • HP ZBook Fury17G7 Mobile Workstation
      • Dell Precision 7920 Tower
      • DeepLearning BOXⅡ
      • DeepLearning STATION
      • NVIDIA EGX サーバー
      • HITACHI SR24000
    • 数値計算・解析おすすめ一覧 >
      • HP Z4 G4 Workstation
      • HP Z8 G4 解析ソフトウェア動作確認済みモデル
      • Supermicro 7049GP
    • NVIDIA A100搭載 Supermicro 740GP
  • ストレージ
    • Synology
    • DDN STORAGE
    • PURESTORAGE
  • HPC
    • HPC Workstation
    • HPCおすすめGPUサーバー
    • HPC SIサービス
    • AXXE-L by XTREME-D
    • NVIDIA HPC SDK
    • プログラム高速化サービス
  • クラウド製品
    • セキュリティ >
      • KernelCare
    • 仮想化 >
      • Login VSI
      • Login PI
    • リモートアクセス >
      • FastX
      • NiceDCV
      • NoMachine
    • ハイブリッドクラウドNAS >
      • Morro Data
    • クラウドストレージ >
      • クラウドストレージ Wasabi
  • GPUコラム / 導入事例
    • GPUプログラミング >
      • 初級編
      • 中級編 >
        • 第4回:MPI+OpenACC実装における計算と通信のオーバーラップ
        • 第3回:拡散現象シミュレーションのおさらい
        • 第2回:簡単なOpenACC + MPI コードで考える
        • 第1回:複数のGPUを使う方法とは?
    • GPU Technology for CG/AI >
      • 深層学習を利用した画像処理・必要なGPU性能
      • トランスフォーマー 最近流行のニューラルネットワーク
      • GAN Inversion による写実的画像生成の制御
      • 深層学習におけるアノテーションコストを抑えるための取り組み Active Learning
      • 深層学習に基づく人物画像の再照明
      • GPUの起源と進化
      • AlphaGo とその後
      • CUDAを用いたシンプルなパストレーシング
      • 流体シミュレーションの応用
      • GPUを用いた高速レンダリング
      • GPUを基盤としたCG/AIの技術進化
    • シリコンバレー発信 New Technology Report >
      • 最新記事から
    • ツブ子が聞く・見る・行く! >
      • 見る!NVIDIA RTX A6000
      • 聞く!NVIDIA DGX A100
      • 見る!NVIDIA A100 Tensor Core GPU
    • 導入事例 >
      • DGX SYSTEMS >
        • NVIDIA DGX A100 | 金沢大学
      • GPU Computing
  • 会社情報
    • ごあいさつ
    • 会社概要
    • アクセスマップ
    • 採用情報
  • お問い合わせ