High Performance ATSUKAN Computing

目次

概要

近年深層学習を含めGPU(Graphics Processing Unit)を用いた並列計算が盛んであるが,それはそうとして冬は熱燗の時期である. 本研究ではグラフィックボードのファンを取り外し徳利を設置し,行列計算等の計算を行うことでGPU温度を高め燗をつけた.

続編 Multi-node High Performace ATSUKAN Computing

目次
  1. 実験構成
    1. 概要
    2. ハードウェア
    3. ソフトウェア
  2. 実験
    1. 対cublasSgemm
    2. GPUとの接触について
    3. GPU温度と液体温度の関係
    4. 燗をつけるぞ!!
  3. 知見
    1. インラインアセンブリ
    2. 使用レジスタ数について
    3. unrollついて
  4. 今後の課題
  5. 終わりに

実験構成

概要

グラボのファンを取り除いて徳利を置き燗をつける.

GPU上で計算(以降「燗計算」と呼ぶ.)を行う. 燗計算としてはGEMM (GEneral Matrix Multiply)計算やN体問題,ジュリア集合計算などを実装した. 一般に高効率で最適な並列数なプログラムほど消費電力が高い. 今回は効率的な加熱を行うため最適並列数などの複数のパラメータについてグリッドサーチを行うプログラムを作成した.

ハードウェア

部品 型番
CPU AMD Athlon 200GE
M/B MSI A320M PRO-VD/S
RAM DDR4 2666MHz PC4-21300 8GB
SSD Kingston SSD SA400S37/120G
Graphics ASUS GTX650-E-1GD5
グラボ置き 学位記

ソフトウェア

OS

ArchLinux
uname -a
Linux 4.19.8-arch1-1-ARCH #1 SMP PREEMPT Sat Dec 8 13:49:11 UTC 2018 x86_64 GNU/Linux

プログラム

監視スレッドは燗関数計算スレッドを立ち上げ,GPU温度や消費電力の測定を行う.

プログラムの大まかな仕様

  • プログラムの引数として燗関数の種類(GEMM,N体問題等),燗関数へのパラメータ(並列数や問題サイズ等),計算型(float/double),実行時間を指定できる
  • プログラムの引数としてパラメータ探索を行うよう指定でき,グリッドサーチを行う

  • プログラムの引数として出力モードを切り替えることができ,人間に優しい表示かデータ処理をしやすいようカンマ区切り形式での標準出力を行う

実験

実験0. 対cublasSgemm

cuBLASのSGEMM (Single precision GEMM)はNVIDIAによってSASSレベルでチューニングが行われているとも言われ,これに及ぶ電力消費のプログラムを書くことに挑戦した.

この実験のみ以下の構成で行う.

実験環境

CPU
Intel(R) Xeon(R) CPU E3-1220 v3 @ 3.10GHz
GPU
NVIDIA Geforce GTX 1080 (CardはFounders Edition)
NVIDIA Driver
410.48
CUDA
10.0

実験内容

今回作成した熱燗プログラムのグリッドサーチ機能を用いて消費電力が最大となるパラメータをcublasSgemm及び自作燗関数(以下「挑戦燗関数」)で探索し,最大消費電力を比較する.

実験結果

NVIDIA Geforce GTX1080の最大消費電力は180Wである. cublasSgemmの最大消費電力を計測したところ169.378Wであった. これに対し知見[0]知見[1]などをもとに作成した挑戦燗関数の最高消費電力は162.945Wとなった. 適当に書くと50~140W程度なのでcublasSgemmには劣るものの悪くはない数値であると考えられる.

今回作成した挑戦燗関数はN回の単精度浮動少数のadd計算の後グローバルメモリに値を書き込むというもので,最適な計算とメモリアクセスの頻度,最適なスレッド数についての調査を行うために書いたものであった.

最適なメモリアクセス頻度としては16回のADD計算に対して1回のメモリアクセスが最高効率という結果を得た.

最適スレッド数探索を行ったところ多くの燗関数で256という結果を得た.

実験1. GPUとの接触について

はじめにグラフィックボードからファンとヒートシンクを取り除きグリスを塗り徳利(平底フラスコ)に水を入れ加熱しました. が,燗計算を行う前にGPUの温度が上昇しデバイスをロストしました.

適度に冷却した上で実験を行わないといけないようですね. そのため以降の計算ではヒートシンクをGPUととっくりの間に挟み,適度に冷却を行いながら実験を行いました.

実験2. GPU温度と液体温度の関係

加熱対象を水/日本酒(料理酒:13度)とし,温度計を挿入後GEMM計算を行いながら温度を測定した. 加熱対象は初期温度からの温度上昇を,GPU温度はそのままの温度をグラフにしたものが下図である.

GEMMの問題サイズを大きくしすぎるとGPUがロストするので適切な問題サイズで実験は行った.(3つのN×N行列のGEMM計算でN=64,液量は45mL)

お酒のほうが比熱が低いので早く温まるかなと思っていたけど微妙です. 室温も関係しそうだけど一定にするのしんどい.

実験3. 燗をつけるぞ!!

GEMM! GEMM! GEMM!!

燗関数をと問題サイズを適切に選んで45度程度に上げました.

私はすっかりお酒を飲めなくなってしまったのでお寿司だけいただきました.

知見

知見0. インラインアセンブラ

CUDA/Cでインラインアセンブラasmを用いる場合,コンパイラによる最適化を無効にするvolatile修飾を行うことでGPUの消費電力の増加が見られた.

そこでvolatileの有無がSASSにどのような影響を与えるかを調べた. コンパイルしたカーネルは次のものである.

次の画像がSASSの差分表示である.

  1. コード量の変化によりジャンプ先のアドレスが変わる.
  2. FADD命令が2箇所に分散する

知見1. 使用レジスタ数について

上記のコードを以下のように使用するレジスタ数を変更した. これによって消費電力が増加した.

知見2. unrollについて

上のコードにおいてfor文を用いず

add.rn.f32 %0, %tf1, %tf1;
を動的にN個並べたPTXをNVRTC(NVIDIA RunTime Compilation)を用いてコンパイルして実行するプログラムを書き実行した.

結果消費電力の増加は見られず,むしろ半分程度に減少した. これはInstruction Cacheをうまく使えなかったことなどが原因であると考えられる.

今後の課題

  • 冷却を適切に行なった上で徳利に熱が移動する冷却構造を考案し,最高消費電力を叩き出すパラメータで熱燗を沸かしたい
  • ハイエンドなGPUでないと消費電力等をNVML APIで取得できないため,壊してもいいハイエンドなGPUを手に入れたい
  • 温度を一定に保つよう温度計と燗計算を連動させたい
  • いい加減お酒をまた飲めるようになりたい
    夏に北海道の余市蒸溜所で飲みすぎて小樽駅のホームとトイレで死にそうな3時間を過ごしたことやいろいろなことを引きずっているのをどうにかしたいです....

終わりに

今回燗をつけるために用いたGPUがKepler世代のもので,SFUを始めとしたいろいろなものが使えずびっくりしました. きっと数年後にはPascal世代に触れてTensorCoreが使えなくてびっくりしたりするんでしょうね.

自分の書いたGPU上で走るカーネル関数が出す熱で燗をつけるということではじめましたが,自分の作った石で熱燗とか作ってみたいですね. 最近話題のMN-CoreのP社とかPxxx-SCxのP社の方々は大きなI社やA社より自分たちが石を作っている実感を得られた上で熱燗を作れるでしょうし羨ましいです.

本実験では以下のことを得ました

  • 冬になるとArchLinuxのインストールバトルをしたくなる私の満足感
  • 先端ソフトウェア工学の課題プログラム
  • GPUの性質
  • ヒートシンクとファンのありがたさ
  • 熱燗とお寿司

謝辞

研究室で自分の研究の進捗も生まずに熱燗づくりに没頭している私にアドバイスをしてくださった研究室の先生に感謝いたします. また,メモリアクセス頻度の話など助言してくださったバイト先の方々にも感謝いたします. 最後に断酒状態の私の代わりに作った熱燗を飲んでくれた父親に感謝します.

参考文献

  • Zhe Jia, Marco Maggioni, Benjamin Staiger, Daniele P. Scarpazza : Dissecting the NVIDIA Volta GPU Architecture via Microbenchmarking, arXiv:1804.06826
カテゴリー:その他
記事作成日:2018-12-18