• No results found

GPU を用いた高スループット計算システムの実装

N/A
N/A
Protected

Academic year: 2021

Share "GPU を用いた高スループット計算システムの実装"

Copied!
4
0
0

Bezig met laden.... (Bekijk nu de volledige tekst)

Hele tekst

(1)

GPU を用いた高スループット計算システムの実装

谷 和也

広島大学大学院工学研究科

概 要

近年,膨大なデータの処理は現代のコンピュータ・

システムの課題として広く知られている.本研究では,

膨大なデータに対して処理を行う際の高スループット な計算システムの実装を提案する.実装には GPU と NVIDIA 社が提供する GPU 向けの統合開発環境であ る CUDA[1] を使用する.GPU(Graphics Processing Units) とはグラフィクス処理用に開発されたハード ウェアであり,多数の演算コアを搭載している.これ を汎用演算に利用し,システムを実現する.本システ ムでは膨大なデータに対しては分割して処理を行う.

性能の評価として膨大な数の 32 点 FFT を計算する プログラムを作成し,本システム上で実行したときの 結果を考察する.GPU として Geforce GTX TITAN を使用して構築した本システムでは 50 ギガバイトの 膨大な 32 点 FFT 入力データに対して,32MB ごとに 分割して処理したときが総処理時間 12799.53ms,ス ループットは 3.91GB/sec となり,処理時間とスルー プットのバランスに優れていた.

1.

はじめに

GPU(Graphics Processing Units) とは多数のプロ セッサコアが搭載されたハードウェアである.多数の コアで並列計算が可能で,非常に高い演算能力を有し ている.もとはグラフィクス処理用に開発されたハー ドウェアであったが,近年ではその演算能力を汎用演 算に用いる GPGPU(General-Purpose computing on Graphics Processing Units) と呼ばれる試みが盛んに 行われており,GPGPU 向けの GPU が多く開発され ている.

本研究で用いた CUDA とは NVIDIA 社が提供す る GPGPU 向けの統合開発環境である.GPU に対応 したソフトウェアアーキテクチャであり,GPU 上の 多数のコアに対してスレッドを割り当て並列計算を行 う.複数のスレッドの集合はブロックと呼ばれ,GPU のストリーミングマルチプロセッサに割り当てられ る.GPU には全てのスレッドが共有するグローバル メモリと,同じブロック内でのみ共有するシェアード メモリが存在する.本研究では,膨大なデータ処理の ため,比較的大容量であるグローバルメモリを使用し て実装を行う.

CUDA を使用して開発したプログラムは CPU によ る処理部分を記述したコードと,GPU による処理部 分を記述したコードからなる.GPU 上で実行される

関数はカーネルと呼ばれ,CPU 側のコードから呼び 出される.GPU のメモリ領域は CPU から独立して いるため,カーネルが処理するデータは GPU メモリ 上へと転送してやる必要がある.当然,処理終了後に 結果を得るためには,同様に GPU メモリから CPU メモリ上へと転送しなければならない.以上のこと から,GPU を用いた処理は以下の 3 ステップで行わ れる.

• データ転送 (HostToDevice)

• カーネル実行 (Kernel)

• データ転送 (DeviceToHost)

ここでは CPU はホストと呼ばれ,GPU はデバイス と呼ばれている.すなわち,HostToDevice とは CPU から GPU へのデータを転送を意味する.全体的な 手順としては,まず入力データが CPU 側で作成され GPU へと転送される.その後 CPU 側からカーネル が呼び出され,GPU のグローバルメモリにあるデー タに対して処理が行われる.そして得られた結果は再 び CPU へと送り返される.

CPU

Input

Output HostToDevice

DeviceToHost

Kernel

GPU

図 1: CPU-GPU プログラムの概要

2. CUDA アーキテクチャ

図 2 に GPU のハードウェアアーキテクチャを示す.

GPU には SM(Streaming Multiprocessor) が複数あ り,SM には多数のプロセッサコアが存在している.

各 SM 内にあるシェアードメモリは同一の SM 内で のみ共有可能なメモリ領域で,アクセスが非常に速い 代わりに容量が小さいという特徴を持っている.一方 で各 SM が接続されているグローバルメモリは全て のプロセッサコアで共有が可能なメモリである.ただ し,グローバルメモリはシェアードメモリと比べてア クセスのオーバーヘッドが大きいため,効率的なアク

– 1 –

(2)

セスをするのが重要である.

GPU のハードウェアアーキテクチャに対応するソ フトウェアアーキテクチャが CUDA である.図 3 に CUDA アーキテクチャを示す.CUDA はスレッド,ブ ロック,グリッドが GPU と対応して階層構造になっ ている.スレッドが処理の最小単位であり,GPU に おけるプロセッサコアに対応する.同様にスレッド の集合であるブロックは SM に対応し,グリッドは GPU 全体と対応している.

グローバルメモリアクセス

本研究では膨大な数のデータを扱うため,大容量の グローバルメモリを使用している.グローバルメモ リアクセスでは各スレッドが連続したメモリ領域へア クセスする場合は一度でアクセスすることができる.

これはコアレスドアクセスと呼ばれている (図 4).し たがって CPU から GPU へと入力データが渡される 際に,メモリアクセスがコアレスドアクセスとなるよ うなデータに並べ替えてから転送している.この並び 替えの方法が図 10 にあるが,これについてはまた第 3. 章で詳しく説明する.

Global Memory core core core core core core core core

Shared Memory

core core core core core core core core

Shared Memory core core

core core core core core core

Shared Memory streaming multiprocessor

streaming multiprocessor

streaming multiprocessor

図 2: GPU アーキテクチャ

thread block

thread thread thread thread thread thread thread

thread block

thread thread thread thread thread thread thread

thread block

thread thread thread thread thread thread thread

grid

図 3: CUDA アーキテクチャ

ストリーム

CUDA におけるストリームには GPU の処理を管 理するキューとしての役割がある.デフォルトではス

thread 0 1 2 3 4 5 6 7

図 4: コアレスドアクセス

トリームは 1 つのみ用意されており,GPU へ発行し た命令は発行された順に従って逐次的に実行されるこ とが保証されている.また,ストリームは複数生成す ることができ,プログラマが任意のストリームに命令 を投入していくことが可能になっている.ストリーム 間で異なる命令を処理することができるため,分割し た各データに対するメモリコピー及びカーネル実行 を各ストリームに割り当てれば別々に結果を得ること も可能である.また,今回の研究には使用していない が,ストリームにはもっと発展的な機能が備わってい る.それは,ストリーム同士には依存関係がなく独立 に処理されるため,非同期に実行が可能でストリーム 同士の並列処理が可能であるということである.これ により,処理をオーバーラップすることで全体の処理 時間をさらに短縮できる.しかしオーバーラップの可 能性はハードウェアに依存し,オーバーラップした場 合は処理の順序が複雑化するため,これについては今 後の課題として考えている.

Time

stream 0

stream 1

stream 2

レイテンシ

レイテンシ

レイテンシ

図 5: ストリームを利用したデータの分割処理

3.

実装方法

本研究では膨大な数のデータが外部のソースから 計算を行うデバイスに送信されてくる状況を想定し,

そのような状況下で高いスループットを保ったまま,

効率よく出力を得るためのシステムを提案する.外部 のデータソースを CPU,計算を行うデバイスを GPU で構築する.このシステムでは通常の GPU を用いた 演算手法ではデータの数が多いほど転送時間と処理 時間が長くなるため効率が良いとはいえない.膨大な データの転送と処理を一括で行うのは結果を得るま でに時間がかかることになる.ここで,GPU への転 送開始から計算結果の CPU 転送が終了するまでの時 間をレイテンシと呼ぶものとする.

そこで,分割した入力データを一定の周期で GPU に転送するようなプログラムを作成することで,CPU から GPU へデータが流れてくる状況を実現した.図

– 2 –

(3)

6 は一定の周期でデータが転送されるプログラムの概 要を表している.左の時間軸は CPU のタイムライン であり,このタイムラインにおいて 10ms ごとにコー ルバック関数が呼び出されている.コールバック関数 は第 1. 章で紹介した通り,GPU の処理の基本である 3 ステップを含んでいる.この 3 ステップの GPU 処 理が完了したらコールバック関数を終了し,次の周 期が来るまでは CPU はスリープさせておく.データ の到着周期よりも GPU の処理にかかる時間が長くな ると,現実のシステムにおいて入力されてくるデー タに対して処理が間に合わなくなり,エラーが発生 する可能性がある.したがって,本研究のシステム では GPU 処理にかかる時間が周期よりも長くならな いように,GPU の処理の実行時間を予め計測してお き,その時間を例外なくカバーできるような周期を 設定する必要があった.図 7 および図 8 に分割サイ ズが 32MB と 128MB の 2 つにおいて全レイテンシ をグラフ化したものを示す.このグラフからレイテン シに大きく外れる値はほとんどないとわかる.また,

32MB よりも 128MB のほうが値の振れ幅が小さいた め,データを分割するサイズが大きい場合,レイテン シは安定した値を計測できる.このようにして全ての 分割サイズについて求めた周期は表 1 にある.

0

10

callback()

time Sleep

データ転送 (HtoD) カーネル実行 データ転送 (DtoH)

Sleep

callback() 20

callback()

データ転送 (HtoD) カーネル実行 データ転送 (DtoH)

GPU

GPU CPU

図 6: 周期 10ms でデータが GPU へ転送されるプロ グラム

分割サイズ (MB) 1 2 4 8 16 32 64 128 256 512 1024 周期 (ms) 2 2 2 3 5 8 16 30 60 120 240

表 1: 分割サイズごとのコールバック関数を呼ぶ周期 このシステムでは分割されたデータごとに処理が 行われるため,計算結果を細かく得ることが可能とな る.しかし,分割するサイズによっては良い結果をも たらさない可能性が考えられる.例えば,小さく分割 し過ぎた場合は実行時間の短い多数のカーネルを実 行することになり,カーネル実行のオーバーヘッドに

0 1 2 3 4 5 6 7 8 9

1 38 75112 149

186 223

260 297

334 371

408 445

482 519

556 593

630 667

704 741

778 815

852 889

926 963

1000 1037

1074 1111

1148 1185

1222 1259

1296 1333

1370 1407

1444 1481

1518 1555

1592 DtoH Kernel HtoD

図 7: 分割サイズ 32MB のときのレイテンシ

0 5 10 15 20 25 30 35

1 10 19 28 37 46 55 64 73 82 91100 109

118 127

136 145

154 163

172 181

190 199

208 217

226 235

244 253

262 271

280 289

298 307

316 325

334 343

352 361

370 379

388 397

DtoH Kernel HtoD

図 8: 分割サイズ 128MB のときのレイテンシ より全体の実行時間が長くなることがある.全体の実 行時間やスループットのパフォーマンスの低下を抑え つつ,レイテンシを短縮できるような効率的な分割サ イズを発見するため,FFT のプログラムを用いて実 験を行った.

32 点の FFT を CUDA の各スレッドで実行するプロ グラムを作成し,このプログラムに対して膨大な数の 入力データを与えて実験を行った.具体的には 4∗10

6

個の FFT の入力データ (1GB) を 1 つの配列内に用 意し,これを 50 回繰り返し利用することで 200∗ 10

6

個の FFT 入力データとして使用している.この入力 データ配列 (1GB) を CUDA のストリームという機 能を用いて分割して処理することでレイテンシの短 縮を試みる.様々な分割サイズで時間の計測を行い,

パフォーマンスを確認した結果,データを適切に分割 すれば全体の実行時間をほとんど延ばすことなくス ループットについても高い値を保つことができた.

CUDA による FFT の実装

高速フーリエ変換 (FFT) は離散フーリエ変換を高 速に計算するアルゴリズムである [3].本研究では 1 次元 FFT である Cooley-Tukey 型 FFT と呼ばれる アルゴリズム [2] の実装を行った.ここでは FFT の 実装方法ではなく,FFT の実装に CUDA アーキテク チャがどう使用されたかということについて説明す る.本研究では膨大な数の FFT データを処理するた めに,各スレッドが FFT を逐次的に計算している.

FFT の入力データは全てまとめて 1 つの配列に格納 されており,各スレッドはその配列の中の自分の担当 する領域にアクセスする.このスレッドの振る舞いを

– 3 –

(4)

示しているのが図 9 である.

・・・

・・・・・・

・・・ ・・・・・・・・・・・・

・・・

・・・・・・

・・・ ・・・・・・・・・・・・

thread 0 thread 1 thread 2 thread 3

32点FFT 32点FFT 32点FFT 32点FFT

図 9: FFT 入力データに対するスレッド割り当て このアクセス方法では各スレッドが連続した領域に アクセスしていないのでコアレスドアクセスにはな らない.コアレスドアクセスを行うようにするため には,配列をブロックごとに転置してから GPU のメ モリへとコピーすればよい (図 10).FFT では 32 点 へのアクセス順は一定になる特徴があるため,ブロッ ク内の全スレッドのアクセスが連続した領域に対して 行われコアレスドアクセスとなる.

転 置

thread 0

1 2 3

thread0 1 2 3

32 点FFT

コアレスドアクセス コアレスドアクセスではない

図 10: GPU に転送する前の転置処理

4.

実験結果・考察

実験に使用した GPU は NVIDIA Geforce GTX TI- TAN でストリーミングマルチプロセッサが 14 基,プ ロセッサコアが 2688 個,グローバルメモリは 6GB 搭載されている.使用した CPU は Intel Core i7 で ある.GPU を用いて 32 点 FFT を実行するプログラ ムを実装し,レイテンシ,総実行時間,及びスルー プットを計測した.200∗10

6

個の FFT データ (50GB) を入力とするプログラムを 11 通りの分割サイズで計 測して結果を比較した.分割サイズは 1MB, 2MB, 4MB, 8MB, 16MB, 32MB, 64MB, 128MB, 256MB, 512MB, 1024MB の 11 通りである.

表 2 は分割サイズごとにスループット,レイテン シ,総実行時間を比較したものである.ただし,表 2 のスループットは分割されたデータ内で計測されたレ イテンシの最大値である.より小さく分割する 1MB, 2MB, 4MB ではレイテンシが短くなる代わりに総実 行時間がかなり長くなっている.一方で 1024MB で はレイテンシが最長となっている.計測結果について のグラフを図 11 に示す.図 11 は総実行時間とレイ テンシを表すグラフである.横軸には分割サイズとス

サイズ スループット レイテンシ 総実行時間 (MB) (GB/sec) (ms) (ms)

1 0.49 0.56 102396.28 2 0.98 0.73 51197.86 4 1.95 1.22 25598.51 8 2.60 2.58 19198.26 16 3.13 4.39 15998.85 32 3.91 7.85 12799.53 64 3.91 15.37 12798.81 128 4.17 29.95 11999.54 256 4.17 59.80 11998.84 512 4.17 119.97 12000.03 1024 4.17 239.73 11999.85

表 2: 分割サイズごとの計測値

ループットが表示されている.グラフから,総実行時 間とレイテンシのバランスが優れているのは 32MB 付近であることが見て取れる.このときスループット についても高い値を示している.

0 50 100 150 200 250

0 20000 40000 60000 80000 100000 120000

1 2 4 8 16 32 64 128 256 512 1024

総実行時間 レイテンシ

分割サイズ

[MB]

レイテンシ

[ms]

総実行時間

[ms]

4.17 4.17 4.17 4.17 3.91 3.91 3.13 2.60 1.95 0.98

0.49

スループット

[GB/sec]

図 11: 計測結果のグラフ

5.

まとめ

本研究では GPU を用いて膨大な数の入力データを 分割し効率的に処理する高スループット計算システム を実装した.各スレッドが 32 点の FFT を実行する プログラムを分割サイズを変えて実行時間を計測し,

計 11 通りのサイズで比較を行った.その結果,32MB のデータごとに処理を行うとき,高スループットを維 持しながら実行時間とレイテンシのバランスが優れ ていることがわかった.

参考文献

[1] NVIDIA Corp., ”CUDA ZONE”, https://

developer.nvidia.com/cuda-zone

[2] Takuya Ooura, ”FFT の概略と設計法”, http://

www.kurims.kyoto-u.ac.jp/ ooura/fftman/

[3] 佐川雅彦・貴家仁志, ”高速フーリエ変換とその応 用”, 1992

– 4 –

Referenties

GERELATEERDE DOCUMENTEN

第4章 では、ソフトウェアで実装されたフォールトトレランスの概念とFPGAの

11 lili---1111 ・ i i

\end@float で終了する。\end@float は、ペナルティ値を −10004 にして \output ルーチンを起動する。この値での \output ルーチンは \@specialoutput

統計力学の歴史は常にシステムサイズ

[9] Suparno Datta, Ayan Dutta, Sruti Gan Chaudhuri, and Krishnendu Mukhopadhyaya : Circle Formation by Asynchronous Transparent Fat Robots : Distributed Computing and

本章では 3 章で紹介した Merrill らの高速 Radix ソー ト [14] を変更することにより,高速な MSD Radix ソート アルゴリズムを提案する. MSD

MapReduce は, BigData の重要性が注目を浴びている現在,代表的な分散処理フレームワークとして注目されている.しか し

PDP-11 は DEC 社が開発した 16 ビットミニコンピュータである.命令は 1 語 16 ビットで,命令数は 60