GDEP Solutions, Inc.
  • Home
    • 新着情報一覧
    • GPU2020 開催概要 >
      • Day1-AI&GPU
      • Day2-ImagingAI
      • Day3-GPUスパコン
      • 過去開催 GPU2019
  • GPU製品
    • 3月納品可能!GPU搭載ワークステーション
    • AI・データサイエンスおすすめ一覧 >
      • NVIDIA DGX A100
      • DGX STATION A100
      • HP Z8 G4
      • HP ZBook Fury17G7 Mobile Workstation
      • Dell Precision 7920 Tower
      • DeepLearning BOXⅡ
      • DeepLearning STATION
      • NVIDIA RTX サーバー
      • HITACHI SR24000
    • 数値計算・解析おすすめ一覧 >
      • HP Z4 G4
      • HP Z8 G4 解析ソフトウェア動作確認済みモデル
      • Supermicro 7049GP
    • NVIDIA GPU 一覧 >
      • NVIDIA RTX A6000
      • Quadro RTX8000
      • Quadro GV100
      • NVIDIA A100
      • NVIDIA V100S
      • NVIDIA T4
    • GPUレンタル一覧
  • ストレージ
    • ストレージ一覧 >
      • Synology
      • DDN STORAGE
      • PURESTORAGE
  • HPC
    • HPC Workstation
    • AXXE-L by XTREME-D
    • NVIDIA HPC SDK
    • 高速化受託サービス
  • クラウド製品
    • セキュリティ >
      • KernelCare
    • 仮想化 >
      • Login VSI
      • Login PI
    • リモートアクセス >
      • FastX
      • NiceDCV
      • NoMachine
    • ハイブリッドクラウドNAS >
      • Morro Data
  • GPUコラム / 導入事例
    • GPUプログラミング入門 >
      • 第11回:OpenACCを使ったICCG法の高速化
      • 第10回:OpenACCでできる最適化とは?
      • 第9回:速くならない?とりあえずライブラリに頼ろう!
      • 第8回:OpenACCでも扱えるけど面倒な構造体
      • 第7回:今あるプログラムを楽に速くするためには
      • 第6回:プログラムの実行時間を確認しよう
      • 第5回:コンパイラのメッセージを確認しよう
      • 第4回:拡散現象シミュレーションのOpenACC化
      • 第3回:データ転送の最小化はほとんどのアプリケーションで必須
      • 第2回:その前に知っておきたいGPUの特長
      • 第1回:今あるプログラムを楽に速くするためには?
    • GPU Technology for CG/AI >
      • AlphaGo とその後
      • CUDAを用いたシンプルなパストレーシング
      • 流体シミュレーションの応用
      • GPUを用いた高速レンダリング
      • GPUを基盤としたCG/AIの技術進化
    • ツブ子が聞く・見る・行く! >
      • 聞く!NVIDIA DGX A100
      • 見る!NVIDIA A100 Tensor Core GPU
    • 導入事例 >
      • DGX SYSTEMS
      • GPU Computing
  • 会社情報
    • ごあいさつ
    • 会社概要
    • アクセスマップ
    • 採用情報
  • お問い合わせ

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

第8回:OpenACCでも扱えるけど面倒な構造体
画像

第8回:OpenACCでも扱えるけど面倒な構造体

9/30/2020

 
前回までは、シンプルな 拡散方程式のプログラム を例にOpenACCの基本的な使い方を学んできました。

​実のところ拡散方程式のプログラムは、OpenACCと非常に相性の良いプログラム例です。しかし最初に述べた通り、OpenACCで全てがうまく行くわけではありません。

​今回からは、どんな時にうまく行かないのか、そしてうまく行かないときにどう解決したら良いのか、について学びます。

OpenACCでも扱えるけど面倒な構造体

はじめに、OpenACCで扱えないわけではないけど、扱うのがとても面倒な構造体について紹介します。
​構造体の面倒な点は2つあります。

面倒 ①
​そもそもGPUの仕組み的に、構造体は速度低下の原因になり得る。

前提として、GPUは不連続なメモリアクセスが苦手、という事実があります。
​
​ではそれが、どうして構造体と関わってくるのでしょうか。
前回まで扱っていた拡散方程式のプログラムでは、赤いインクの拡散をシミュレーションするために、赤いインクの濃度を配列で表現しました(図1)。

では同時に、黄色いインクも垂らしたとしたら、どう実装しましょうか。
画像
図1:インクの濃度を表す配列
​図2のような構造体の配列を作る実装が、一つの候補になるのではないでしょうか。

この場合、RとYはそれぞれメモリ上に不連続に配置されるため、速度低下が起き得ます。
​​
画像
図2:構造体の配列による実装例と、メモリ上のデータ配置
速度低下こそ起き得ますが、図2のようなポインタが含まれずサイズが明らかな構造体は、特に苦労なくOpenACCで扱えます(図3)。
​
​参考までに、図3左の例のように、ひとつのループ内で構造体要素全てにアクセスするのであれば、実はさほど速度低下は起きません。
​色違いインクの濃度を扱う程度であればよいのですが、全く別の物理量(圧力、密度、速度、etc.)を構造体にした場合、そうもいきませんよね?
画像
図3:図2の構造体の配列のOpenACCにおける利用例。
またこのような構造体の配列を利用した場合に、
​あまり速度低下しない例(左)と速度低下する例(右)。

面倒 ②
​
CPUとGPUのメモリが独立していることに起因する、ディープコピーと呼ばれる問題。

それでは、図4のように配列の構造体として実装した場合はどうでしょう。
​これならば、R も Y もメモリ上に連続して配置されるため、速度低下は気にしなくてもよさそうです。
​
​しかしこれをOpenACCで扱う場合、ディープコピーと呼ばれる問題が付きまといます。
この構造体 f を、CPUからGPUにコピーしたとき、何が起きるでしょうか。
画像
図4:配列の構造体による実装例と、メモリ上のデータ配置
画像
図5:ポインタのメンバを持つ構造体をCPUからGPUへコピーした場合。
構造体 f をCPUからGPUへコピーした結果が図5です。
fに保存されている内容は、f.R や f.Y が CPUのメモリ上のどこにあるか、というあくまでCPU側でのアドレス情報でしかありません。

​GPUのメモリはCPUと独立しているわけですから、f の内容だけコピーしても意味がありません。これを解決する方法は以下の5つくらいあると思われるのですが…
  1. NVIDIAのハイエンドなGPU + PGI compiler なら使える Unified memory 機能を使う。

  2. PGI compiler の最新版なら使える deepcopyというコンパイラオプションを使う。

  3. OpenACCの最新仕様にある attach、detach という指示子の使い方を調べる。

  4. 構造体 f をcreateした上で、構造体の中身 f.R, f.Y をcopyすると、GPU上でのポインタも更新されるというOpenACCの仕様を覚える。

  5. 構造体を使わない。
私は「5. 構造体を使わない」を推奨しています。

というのも、1~4は「※ただし」という例外規定があって、覚えるのが面倒だからです(私も覚えてません)。

その点「5. 構造体を使わない」は、図6のように、単に新しいポインタを宣言して置き換えてしまうという、CやFortranに準拠した方法で代替可能なので、OpenACCの細かい仕様を覚える必要がないのです。
​
書き換える行数自体は多いのですが、テキストエディタで文字列置換するだけで済みますから、いちいちOpenACCの仕様を調べに行くよりよっぽど早いです。

​しかも、OpenACCを無視してCPUで計算する場合においても、​構造体の参照コストが少ない分、速くなる可能性すらあります。
画像
図6:OpenACCにおける、一番楽(多分)な構造体の扱い方
GPUで構造体をどのように扱うかというのは、性能と利便性のトレードオフになりますので、OpenACC・CUDAに関わらず、結構難しい問題です。

個人的には、上記のようにポインタで代替する方法を推しますが、環境が整えば1も強力な手法ですし、ソースを書き換えたくない場合には2~4も手段かと思います。

​色々方法があるらしいことだけ覚えておいていただければ幸いです。

< 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年:東京工業大学

    ​大学院情報理工学研究科 数理・計算科学専攻 博士課程修了 博士(理学)

    アーカイブ
    第1回(2020年1月)
    ​第2回(2020年3月)
    第3回(2020年4月)
    第4回(2020年5月)
    ​第5回(2020年6月)
    ​
    第6回(2020年7月)
    第7回(2020年8月)
    第8回(2020年9月)
    ​第9回(2020年10月)
    ​
    第10回(2020年11月)
    第11回(2020年12月)
    ​一覧で見る ≫

    RSS フィード

Picture
GDEPソリューションズ株式会社
東京都文京区本郷三丁目34番3号 本郷第一ビル8階
TEL:03-5802-7050
・NVIDIA認定 Elite Partner [最上位レベル]
・NVIDIA Advanced Technology Program 達成  [DGX 販売資格]
・東京都公安委員会 古物営業許可番号
 第305471905562号
≫ 新着情報
​

GPU製品
≫ 3月納品可能!GPU搭載ワークステーション
≫ AI・データサイエンスおすすめ
≫ 数値計算・解析おすすめ一覧
≫ NVIDIA GPU一覧

≫ GPUレンタル一覧

HPC
≫ HPC Workstation
≫ AXXE-L by XTREME-D
≫ NVIDIA HPC SDK
≫ 高速化 受託サービス
​ストレージ
​≫ ストレージ一覧

クラウド製品
​≫ セキュリティ
≫ 仮想化
≫ リモートアクセス

≫ ハイブリッドクラウドNAS

​GPUコラム/導入事例
≫ GPUプログラミング入門
≫ GPU Technology for CG/AI
≫ ツブ子が聞く・見る・行く
≫ 導入事例
会社情報
≫ ごあいさつ
≫ 会社概要
≫ アクセスマップ
≫ 採用情報
​
≫ お問い合わせ
​
≫ 個人情報の取扱いについて
≫ 利用規約
©2020 GDEP Solutions,Inc.
  • Home
    • 新着情報一覧
    • GPU2020 開催概要 >
      • Day1-AI&GPU
      • Day2-ImagingAI
      • Day3-GPUスパコン
      • 過去開催 GPU2019
  • GPU製品
    • 3月納品可能!GPU搭載ワークステーション
    • AI・データサイエンスおすすめ一覧 >
      • NVIDIA DGX A100
      • DGX STATION A100
      • HP Z8 G4
      • HP ZBook Fury17G7 Mobile Workstation
      • Dell Precision 7920 Tower
      • DeepLearning BOXⅡ
      • DeepLearning STATION
      • NVIDIA RTX サーバー
      • HITACHI SR24000
    • 数値計算・解析おすすめ一覧 >
      • HP Z4 G4
      • HP Z8 G4 解析ソフトウェア動作確認済みモデル
      • Supermicro 7049GP
    • NVIDIA GPU 一覧 >
      • NVIDIA RTX A6000
      • Quadro RTX8000
      • Quadro GV100
      • NVIDIA A100
      • NVIDIA V100S
      • NVIDIA T4
    • GPUレンタル一覧
  • ストレージ
    • ストレージ一覧 >
      • Synology
      • DDN STORAGE
      • PURESTORAGE
  • HPC
    • HPC Workstation
    • AXXE-L by XTREME-D
    • NVIDIA HPC SDK
    • 高速化受託サービス
  • クラウド製品
    • セキュリティ >
      • KernelCare
    • 仮想化 >
      • Login VSI
      • Login PI
    • リモートアクセス >
      • FastX
      • NiceDCV
      • NoMachine
    • ハイブリッドクラウドNAS >
      • Morro Data
  • GPUコラム / 導入事例
    • GPUプログラミング入門 >
      • 第11回:OpenACCを使ったICCG法の高速化
      • 第10回:OpenACCでできる最適化とは?
      • 第9回:速くならない?とりあえずライブラリに頼ろう!
      • 第8回:OpenACCでも扱えるけど面倒な構造体
      • 第7回:今あるプログラムを楽に速くするためには
      • 第6回:プログラムの実行時間を確認しよう
      • 第5回:コンパイラのメッセージを確認しよう
      • 第4回:拡散現象シミュレーションのOpenACC化
      • 第3回:データ転送の最小化はほとんどのアプリケーションで必須
      • 第2回:その前に知っておきたいGPUの特長
      • 第1回:今あるプログラムを楽に速くするためには?
    • GPU Technology for CG/AI >
      • AlphaGo とその後
      • CUDAを用いたシンプルなパストレーシング
      • 流体シミュレーションの応用
      • GPUを用いた高速レンダリング
      • GPUを基盤としたCG/AIの技術進化
    • ツブ子が聞く・見る・行く! >
      • 聞く!NVIDIA DGX A100
      • 見る!NVIDIA A100 Tensor Core GPU
    • 導入事例 >
      • DGX SYSTEMS
      • GPU Computing
  • 会社情報
    • ごあいさつ
    • 会社概要
    • アクセスマップ
    • 採用情報
  • お問い合わせ