GPU のアーキテクチャとプログラム構造 長岡技術科学大学電気電子情報工学専攻出川智啓

Similar documents
Microsoft PowerPoint - GPGPU実践基礎工学(web).pptx

Microsoft PowerPoint - GPGPU実践基礎工学(web).pptx

Microsoft PowerPoint - GPGPU実践基礎工学(web).pptx

1. GPU コンピューティング GPU コンピューティング GPUによる 汎用コンピューティング GPU = Graphics Processing Unit CUDA Compute Unified Device Architecture NVIDIA の GPU コンピューティング環境 Lin

熊本大学学術リポジトリ Kumamoto University Repositor Title GPGPU による高速演算について Author(s) 榎本, 昌一 Citation Issue date Type URL Presentation

Slide 1

今回の内容 GPU の発展 GPU のアーキテクチャ CPU の発展 性能の変化 シングルコアからマルチコア GPU の応用例 6

07-二村幸孝・出口大輔.indd

Microsoft PowerPoint - GPGPU実践基礎工学(web).pptx

TSUBAME2.0におけるGPUの 活用方法

CUDA を用いた画像処理 画像処理を CUDA で並列化 基本的な並列化の考え方 目標 : 妥当な Naïve コードが書ける 最適化の初歩がわかる ブロックサイズ メモリアクセスパターン

Slides: TimeGraph: GPU Scheduling for Real-Time Multi-Tasking Environments

バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科

GPU GPU CPU CPU CPU GPU GPU N N CPU ( ) 1 GPU CPU GPU 2D 3D CPU GPU GPU GPGPU GPGPU 2 nvidia GPU CUDA 3 GPU 3.1 GPU Core 1

プログラミング実習I

NUMAの構成

PowerPoint プレゼンテーション

02: 変数と標準入出力

RX ファミリ用 C/C++ コンパイラ V.1.00 Release 02 ご使用上のお願い RX ファミリ用 C/C++ コンパイラの使用上の注意事項 4 件を連絡します #pragma option 使用時の 1 または 2 バイトの整数型の関数戻り値に関する注意事項 (RXC#012) 共用

02: 変数と標準入出力

Slide 1

gengo1-11

情報処理Ⅰ演習

memo

02: 変数と標準入出力

Microsoft PowerPoint - 計算機言語 第7回.ppt

書式に示すように表示したい文字列をダブルクォーテーション (") の間に書けば良い ダブルクォーテーションで囲まれた文字列は 文字列リテラル と呼ばれる プログラム中では以下のように用いる プログラム例 1 printf(" 情報処理基礎 "); printf("c 言語の練習 "); printf

Microsoft PowerPoint ppt

PowerPoint プレゼンテーション

Microsoft PowerPoint - GPUシンポジウム _d公開版.ppt [互換モード]

Microsoft Word - no02.doc

関数の動作 / printhw(); 7 printf(" n"); printhw(); printf("############ n"); 4 printhw(); 5 関数の作り方 ( 関数名 ) 戻り値 ( 後述 ) void である. 関数名 (

GPU チュートリアル :OpenACC 篇 Himeno benchmark を例題として 高エネルギー加速器研究機構 (KEK) 松古栄夫 (Hideo Matsufuru) 1 December 2018 HPC-Phys 理化学研究所 共通コードプロジェクト

関数 C 言語は関数の言語 関数とは 関数の定義 : f(x) = x * x ; 使うときは : y = f(x) 戻り値 引数

02: 変数と標準入出力

3次多項式パラメタ推定計算の CUDAを用いた実装 (CUDAプログラミングの練習として) Implementation of the Estimation of the parameters of 3rd-order-Polynomial with CUDA

7 ポインタ (P.61) ポインタを使うと, メモリ上のデータを直接操作することができる. 例えばデータの変更 やコピーなどが簡単にできる. また処理が高速になる. 7.1 ポインタの概念 変数を次のように宣言すると, int num; メモリにその領域が確保される. 仮にその開始のアドレスを 1

Taro-ポインタ変数Ⅰ(公開版).j

スライド 1

02: 変数と標準入出力

memo

GPGPU

C言語講座

プログラミング実習I

char int float double の変数型はそれぞれ 文字あるいは小さな整数 整数 実数 より精度の高い ( 数値のより大きい より小さい ) 実数 を扱う時に用いる 備考 : 基本型の説明に示した 浮動小数点 とは数値を指数表現で表す方法である 例えば は指数表現で 3 書く

Microsoft PowerPoint - exp2-02_intro.ppt [互換モード]

システムソリューションのご紹介

02: 変数と標準入出力

(1) プログラムの開始場所はいつでも main( ) メソッドから始まる 順番に実行され add( a,b) が実行される これは メソッドを呼び出す ともいう (2)add( ) メソッドに実行が移る この際 add( ) メソッド呼び出し時の a と b の値がそれぞれ add( ) メソッド

( CUDA CUDA CUDA CUDA ( NVIDIA CUDA I

Microsoft PowerPoint - GPU_computing_2013_01.pptx

GPGPUイントロダクション

Microsoft PowerPoint - 11.pptx

第1回 プログラミング演習3 センサーアプリケーション

02: 変数と標準入出力

Microsoft PowerPoint - suda.pptx

いまからはじめる組み込みGPU実装

GPU.....

GPU 画像 動画処理用ハードウェア 低性能なプロセッサがたくさん詰まっている ピーク性能が非常に高い GPUを数値計算に用いるのがGPGPU Graphics Processing Unit General Purpose GPU TSUBAME2.0: GPUスパコン 本演習ではNVIDIA社の

概要 目的 CUDA Fortran の利用に関する基本的なノウハウを提供する 本チュートリアル受講後は Web 上で公開されている資料等を参照しながら独力で CUDA Fortran が利用できることが目標 対象 CUDA Fortran の利用に興味を抱いている方 前提とする知識 Fortran

Microsoft PowerPoint - 09.pptx

CプログラミングI

本文ALL.indd

untitled

02: 変数と標準入出力

Microsoft Word - Cプログラミング演習(11)

GPUを用いたN体計算

<4D F736F F F696E74202D2091E63489F15F436F6D C982E682E992B48D8291AC92B489B F090CD2888F38DFC E B8CDD8

Microsoft PowerPoint - C++_第1回.pptx

Microsoft Word - HOKUSAI_system_overview_ja.docx

CCS HPCサマーセミナー 並列数値計算アルゴリズム

02: 変数と標準入出力

Microsoft PowerPoint - OS07.pptx

Prog1_10th

memo

memo

プログラミングI第10回

Microsoft PowerPoint - 先端GPGPUシミュレーション工学特論(web).pptx

1. マシンビジョンにおける GPU の活用

PowerPoint プレゼンテーション

講習No.1

GPGPUクラスタの性能評価

Microsoft PowerPoint - CproNt02.ppt [互換モード]

Microsoft Word - no202.docx

Microsoft PowerPoint - prog03.ppt

tabaicho3mukunoki.pptx

Microsoft PowerPoint - prog04.ppt

プログラミング基礎

EnSightのご紹介

ストリームを用いたコンカレントカーネルプログラミングと最適化 エヌビディアジャパン CUDAエンジニア森野慎也 GTC Japan 2014

TSUBAME2.0 における GPU の 活用方法 東京工業大学学術国際情報センター丸山直也第 10 回 GPU コンピューティング講習会 2011 年 9 月 28 日

02: 変数と標準入出力

C 言語の式と文 C 言語の文 ( 関数の呼び出し ) printf("hello, n"); 式 a a+4 a++ a = 7 関数名関数の引数セミコロン 3 < a "hello" printf("hello") 関数の引数は () で囲み, 中に式を書く. 文 ( 式文 ) は

04-process_thread_2.ppt

PowerPoint プレゼンテーション

4 倍精度基本線形代数ルーチン群 QPBLAS の紹介 [index] 1. Introduction 2. Double-double algorithm 3. QPBLAS 4. QPBLAS-GPU 5. Summary 佐々成正 1, 山田進 1, 町田昌彦 1, 今村俊幸 2, 奥田洋司

Images per Second Images per Second VOLTA: ディープラーニングにおける大きな飛躍 ResNet-50 トレーニング 2.4x faster ResNet-50 推論 TensorRT - 7ms レイテンシ 3.7x faster P100 V100 P10

C C UNIX C ( ) 4 1 HTML 1

PowerPoint Presentation

Transcription:

GPU のアーキテクチャとプログラム構造 長岡技術科学大学電気電子情報工学専攻出川智啓

今回の内容 GPU のアーキテクチャ CUDA CUDA によるプログラミング 58

GPU(Graphics Processing Unit) とは 画像処理専用のハードウェア 具体的には画像処理用のチップ チップ単体では販売されていない PCI Ex カードで販売 ( チップ単体と区別せずに GPU と呼ぶことも多い ) ノート PC に搭載 PCI Ex カードとして販売される GPU には, ビデオメモリと呼ばれる RAM が搭載 59

GPU(Graphics Processing Unit) の役割 グラフィックスを表示するために様々な処理を行い, 処理の結果をディスプレイに出力 3 次元グラフィックスの発展に伴って役割が大きく変化 描画情報 CPU 3 次元座標変換 ポリゴンとピクセルの対応付け ピクセル色計算テクスチャ参照 フレームバッファ ( ビデオメモリ ) への書き込み ディスプレイ出力 過去 CPU が 3D 描画の演算を実行 GPUが出力 描画情報 3 次元座標変換 ポリゴンとピクセルの対応付け ピクセル色計算テクスチャ参照 フレームバッファ ( ビデオメモリ ) への書き込み ディスプレイ出力 現在 GPUが演算から出力までの全てを担当 CPUは描画情報の生成やGPUへの情報の引き渡し,GPU の制御を行う ディスプレイコントローラ 画面出力 GPU 画面出力 60

GPU の描画の流れ 1. CPUからGPUへ描画情報を送信 2. 頂点処理 ( 頂点シェーダ ) 座標変換 画面上での頂点やポリゴンの位置 大きさの決定 頂点単位での照明の計算 3. 頂点やポリゴンからピクセルを生成 ( ラスタライザ ) 4. ピクセル処理 ( ピクセルシェーダ ) 画面上のピクセルの色 テクスチャの模様 5. 画面出力 ピクセルの色情報をフレームバッファに書き込み 2. 3. 4. 61

ビデオカードから GPU へ CG の多様化と共に固定機能の実装が困難に 頂点処理とピクセル処理をユーザが書き換えられるプログラマブルシェーダの実装 グラフィックスカード GPU 頂点処理用回路 頂点シェーダユニット ピクセル処理用回路 ピクセルシェーダユニット 62

レンダリングパイプライン処理 頂点情報 光源情報 形状データの画面への投影像 実数演算 投影変換 視野変換 陰影計算 材質情報 クリッピング 投影像を画素へ変換 整数演算とメモリアクセス ビューポート変換 走査変換 合成 テクスチャ 出力画像 63

レンダリングパイプライン処理 頂点情報 光源情報 形状データの画面への投影像 実数演算 実数演算を行うハードウェアは高価だった 視野変換陰影計算投影変換クリッピング 材質情報 ハードウェアで処理 ( 固定機能 ) ビューポート変換 走査変換 合成 テクスチャ 出力画像 64

レンダリングパイプライン処理 頂点情報 光源情報 ハードウェアで処理 ( 固定機能 ) 投影変換 視野変換 陰影計算 材質情報 クリッピング ハードウェアで処理 ( 固定機能 ) ビューポート変換 走査変換 合成 テクスチャ 出力画像 65

レンダリングパイプライン処理 頂点情報 頂点シェーダ 投影変換 視野変換 陰影計算 光源情報 材質情報 クリッピング ピクセルシェーダ ビューポート変換 走査変換 合成 テクスチャ 出力画像 66

ビデオカードから GPU へ 頂点処理とピクセル処理をユーザが書き換えられるプログラマブルシェーダの実装 処理によっては利用効率に差が生じる 頂点処理重視の処理 GPU 頂点シェーダユニット ピクセル処理重視の処理 GPU 頂点シェーダユニット 空きユニット ピクセルシェーダユニット ピクセルシェーダユニット 空きユニット 67

ビデオカードから GPU へ 頂点シェーダとピクセルシェーダを統合したユニファイドシェーダへの進化 頂点処理とピクセル処理を切り替えることで利用率を高める 頂点処理重視の処理 GPU ユニファイドシェーダユニット ピクセル処理重視の処理 GPU ユニファイドシェーダユニット 68

ビデオカードから GPU へ 各ピクセルに対して処理を並列に実行 単純な処理を行う演算器 (Streaming Processor, SP) を大量に搭載 演算器は現在 CUDA Core という名称に変更 高い並列度で処理を行う 69

Tesla アーキテクチャの構造 Tesla C1060 の仕様 SM 数 30 CUDA Core 数 240(=8 Core/SM 30 SM) キャッシュを搭載せず 70

Tesla アーキテクチャの構造 Tesla C1060 の仕様 CUDA コア数 ( 単精度 ) CUDA コアクロック周波数 240 Cores 1,296 MHz 単精度演算ピーク性能 622* 1 (933* 2 ) GFLOPS 倍精度演算ユニット数 30* 3 Units 倍精度演算ピーク性能 メモリクロック周波数 メモリバス幅 最大メモリバンド幅 * 4 78 GFLOPS 800 MHz 512 bit 102 GB/s * 1 単精度演算ピーク性能 = コアクロック周波数 コア数 命令の同時発行数 (2) * 2 CUDA Core と SFU が同時に命令を発行できれば 1296 MHz 240 3 * 3 一つの SM に倍精度演算器が一つ搭載 * 4 最大メモリバンド幅 = メモリクロック周波数 メモリバス幅 /8 2(Double Data Rate) 71

Fermi アーキテクチャの構造 Tesla M2050 の仕様 SM 数 14 CUDA Core 数 448(=32 Core/SM 14 SM) L1/L2 キャッシュを搭載 ECC( 誤り訂正機能 ) を搭載 72

Fermi アーキテクチャの構造 Tesla M2050 の仕様 CUDAコア数 ( 単精度 ) CUDAコアクロック周波数単精度演算ピーク性能倍精度演算ユニット数倍精度演算ピーク性能メモリクロック周波数メモリバス幅最大メモリバンド幅 448 Cores 1,150 MHz 1.03 TFLOPS 0* 1 Unit 515 GFLOPS 1.55 GHz 384 bit 148 GB/s * 1 単精度 CUDA Core を 2 基使って倍精度演算を実行 73

Kepler アーキテクチャの構造 Tesla K20c/m の仕様 SMX 数 13 Streaming Multiprocessor extreme (?) CUDA Core 数 2,496(=192 Core/SM 13 SMX) 74

Kepler アーキテクチャの構造 Tesla K20c/m の仕様 CUDAコア数 ( 単精度 ) 2,496 Cores CUDAコアクロック周波数 706 MHz 単精度演算ピーク性能 3.52 TFLOPS 倍精度演算ユニット数 832* 1 Units 倍精度演算ピーク性能 1.17 TFLOPS メモリクロック周波数 2.6 GHz メモリバス幅 320 bit 最大メモリバンド幅 208 GB/s * 1 64 基 /SMX 13 基 75

Maxwell アーキテクチャ GeForce GTX TITAN X の仕様 SM 数 24 CUDA Core 数 3,072(=128 Core/SM 24 SM) 76

Maxwell アーキテクチャ GeForce GTX TITAN X の仕様 * CUDA コア数 ( 単精度 ) CUDA コアクロック周波数 単精度演算ピーク性能 3,072 Cores 1,002 MHz 6.14 TFLOPS 倍精度演算ユニット数 0* 1 Units 倍精度演算ピーク性能 192 GFLOPS* 2 メモリクロック周波数 3.5 GHz* 3 メモリバス幅 最大メモリバンド幅 *http://ja.wikipedia.org/wiki/flops http://http://www.geforce.com/hardware/desk top gpus/geforce gtx titan x/specifications 384 bit 336.5 GB/s * 1 http://www.4gamer.net/games/121/g012181/20141225075/ * 2 倍精度演算は単精度演算の性能の 1/32 (1/16 Flop/Core/clock) * 3 DDR(Double Data Rate) 7GHz 相当と書かれている場合もある 77

Pascal アーキテクチャ 2016 年にリリース予定 倍精度演算器を搭載予定 NVLink GPU 同士や GPU と CPU を接続する独自の方式 通信 (CPU メモリ PCI Express メモリ GPU) のボトルネックを解消 (PCI Express3.0 の 5~12 倍 ) 複数の GPU を使って大規模な計算が可能 3D メモリ (High Bandwidth Memory, HBM)* 3 次元積層技術を利用し, メモリの容量と帯域を大幅に増加 最大 32GB, メモリ帯域 1TB/s *http://pc.watch.impress.co.jp/docs/column/kaigai/20150421_698806.html 78

Volta アーキテクチャ Pascal の後継 詳しい情報は不明 アメリカの次世代スーパーコンピュータへ採用予定 オークリッジ国立研究所 SUMMIT 150~300PFLOPS ローレンス リバモア研究所 SIERRA 100PFLOPS 以上 地球シミュレータと同等の演算性能を 1 ノードで実現 現在 Top500 2 位のスーパーコンピュータと同じ電力で 5~10 倍高速, サイズは 1/5 *http://www.4gamer.net/games/121/g012181/20141225075/ 79

GPU の模式図 GPU Chip Streaming Multiprocessor SM SM SM SM SM SM SM SM レジ ローカルメモリ SM SM SM SM L2 キャッシュ L1 キャッシュ スタ CUDA Core レジスタ CUDA Core 共有メモリ レジスタ CUDA Core レジスタ CUDA Core GPU Streaming Multiprocessor Streaming Multiprocessor CUDA Core CUDA Core ローカルメモリ コンスタントメモリ テクスチャメモリ グローバルメモリ 80

GPU の並列化の階層 グリッド-ブロック-スレッドの3 階層 グリッド (Grid) 並列に実行する処理 GPUが処理を担当する領域全体 スレッド (Thread) GPUの処理の基本単位 CPUのスレッドと同じ ブロック (Block) もしくはスレッドブロック スレッドの集まり 81

GPU の並列化の階層 GPU のハードウェアの構成に対応させて並列性を管理 ハードウェア構成 GPU 並列化の階層 並列に実行する処理 CUDA Grid Streaming Multiprocessor スレッドの集まり Block CUDA Core スレッド Thread 82

CUDA Compute Unified Device Architecture NVIDIA 社製 GPU 向け開発環境 (Windows,Linux,Mac OS X) 2007 年頃発表 C/C++ 言語 + 独自のGPU 向け拡張 専用コンパイラ (nvcc) とランタイムライブラリ いくつかの数値計算ライブラリ ( 線形代数計算,FFTなど) CUDA 登場以前 グラフィックスプログラミングを利用 足し算を行うために, 色を混ぜる処理を実行 汎用計算のためには多大な労力が必要 83

CUDA によるプログラミング CPU をホスト (Host),GPU をデバイス (Device) と表現 ホスト (CPU) 処理の流れや GPU を利用するための手続きを記述 プログラムの書き方は従来の C 言語と同じ 利用する GPU の決定,GPU へのデータ転送,GPU で実行する関数の呼び出し等 84

CUDA によるプログラミング CPU をホスト (Host),GPU をデバイス (Device) と表現 デバイス (GPU) 処理する内容を関数として記述 引数は利用可能, 返値は利用不可 ( 常にvoid) 関数はkernelと呼ばれる 関数呼び出しはlaunch, invokeなどと呼ばれる 85

Hello World 何を確認するか 最小構成のプログラムの作り方 ファイル命名規則 ( 拡張子は.c/.cpp) コンパイルの方法 (gcc, cl 等を使用 ) #include<stdio.h> int main(void){ printf("hello world n"); } return 0; helloworld.c 86

CUDA で Hello World 何を確認するか 最小構成のプログラムの作り方 ファイル命名規則 ( 拡張子は.cu) コンパイルの方法 (nvcc を使用 ) #include<stdio.h> int main(void){ #include<stdio.h> int main(void){ } printf("hello world n"); printf("hello world n"); return 0; helloworld.cu 違いは拡張子だけ? } return 0; helloworld.c 87

CUDA プログラムのコンパイル ソースファイルの拡張子は.cu nvcc を用いてコンパイル CPU が処理する箇所は gcc 等がコンパイル GPU で処理する箇所を nvcc がコンパイル helloworld.cu には CPU で処理する箇所しかない 88

CUDA で Hello World CUDA 専用の処理を追加 #include<stdio.h> global void kernel(){} int main(void){ GPU で実行される関数 ( カーネル ) global が追加されている } kernel<<<1,1>>>(); printf("hello world n"); return 0; 通常の関数呼出とは異なり, <<<>>> が追加されている helloworld_kernel.cu 89

CUDA プログラムの実行 実行時の流れ (CPU 視点 ) 利用するGPUの初期化やデータの転送などを実行 GPUで実行する関数を呼び出し GPUから結果を取得 time CPU 初期化の指示必要なデータのコピーカーネルの実行指示 CPU と GPU は非同期 CPU は別の処理を実行可能 結果の取得 GPU 初期化メモリに書込カーネルを実行実行結果をコピー 90

GPU の構造とカーネルの書き方 プログラムから GPU で実行する関数を呼出 GPU で実行する関数という目印が必要 GPU は PCI Ex バスを経由してホストと接続 GPU はホストと別に独立したメモリを持つ 関数の実行に必要なデータは GPU のメモリに置く GPU はマルチスレッド ( メニースレッド ) で並列処理 関数には 1 スレッドが実行する処理を書く 関数を実行する際に並列処理の度合いを指定 91

GPU の構造とカーネルの書き方 GPU で実行する関数 ( カーネル ) という目印 修飾子 global を付ける GPU は PCI Ex バスを経由してホストと接続 GPU はホストと別に独立したメモリを持つ カーネルの返値を void にする GPU はマルチスレッド ( メニースレッド ) で並列処理 カーネルには 1 スレッドが実行する処理を書く カーネル名と引数の間に <<<1,1>>> を付ける 92

Hello Thread(Fermi 世代以降 ) GPU の各スレッドが画面表示 #include<stdio.h> global void hello(){ printf("hello Thread n"); } int main(void){ 画面表示 (Fermi 世代以降で可能 ) コンパイル時にオプションが必要 arch=sm_20 以降 } hello<<<1,1>>>(); cudathreadsynchronize(); return 0; カーネル実行 ホストとデバイスの同期をとる CPUとGPUは原則同期しないので, 同期しないとカーネルを実行した直後にプログラムが終了 hellothread.cu 93

Hello Thread(Fermi 世代以降 ) <<< >>> 内の数字で並列度が変わることの確認 #include<stdio.h> global void hello(){ printf("hello Thread n"); } int main(void){ } hello<<<?,?>>>(); cudathreadsynchronize(); return 0; <<<>>> 内の数字を変えると画面表示される行数が変わる <<<1,8>>>, <<<8,1>>>, <<<4,2>>> 等 hellothread.cu 94

CPU と GPU のやりとり GPU の想定される使い方 ホスト (CPU) からデータを送り, デバイス (GPU) で計算し, 結果を受け取る CPU と GPU のデータのやり取りが必要 GPU は原則データを返さない PCI Ex 経由で描画情報を受け取り, 画面に出力 カーネルの返値が void の理由 NVIDIA 社ホームページより引用 95

CPU と GPU のやりとり CUDA 独自の命令と C 言語のポインタを利用 GPU のメモリ上に計算に必要なサイズを確保 確保したメモリのアドレスを C 言語のポインタで格納 ポインタの情報を基にデータを送受信 96

CPU と GPU のやり取り ( 単純な加算 ) int 型の変数 2 個を引数として受け取り,2 個の和を返す C 言語らしい書き方 #include<stdio.h> int add(int a, int b){ return a + b; } 引数で渡された変数の和を返す int main(void){ int c; c = add(6, 7); printf("6 + 7 = %d n", c); 関数呼び出し } return 0; add_naive.c 97

CPU と GPU のやり取り ( 単純な加算 ) 関数の返値を void に変更し, メモリの動的確保を使用 #include<stdio.h> #include<stdlib.h> void add(int a, int b, int *c){ *c = a + b; } 引数で渡された変数の和を,c が指すアドレスに書き込み int main(void){ int c; int *addr_c; addr_c = (int *)malloc(sizeof(int)); add(6, 7, addr_c); c = *addr_c; printf("6 + 7 = %d n", c); 引数にアドレスを追加アドレスを基に結果を参照 } return 0; add.c 98

CPU プログラム ( メモリの動的確保 ) malloc 指定したバイト数分のメモリを確保 stdlib.hをインクルードする必要がある #include<stdlib.h> int *a; a = (int *)malloc( sizeof(int)*100 ); sizeof データ型 1 個のサイズ ( バイト数 ) を求める printf("%d, %d n", sizeof(float), sizeof(double)); 実行すると 4,8 と表示される 99

CPU と GPU のやり取り ( 単純な加算 ) add.c の処理の一部を GPU の処理に置き換え #include<stdio.h> global void add(int a, int b, int *c){ *c = a + b; } global を追加 int main(void){ int c; int *dev_c; cudamalloc( (void **)&dev_c, sizeof(int) ); } add<<<1, 1>>>(6, 7, dev_c); cudamemcpy(&c, dev_c, sizeof(int), cudamemcpydevicetohost); printf("6 + 7 = %d n", c); cudafree(dev_c); return 0; GPU 上のメモリに確保される変数のアドレス GPU 上にint 型変数一個分のメモリを確保 GPU から結果をコピーメモリを解放 add.cu 100

CUDA でカーネルを作成するときの制限 カーネルの引数 値を渡すことができる GPUのメモリを指すアドレス CPU のメモリを指すアドレスも渡すことは可能 そのアドレスを基にホスト側のメモリを参照することは不可能 printf などの画面出力 Fermi 世代以降の GPU で, コンパイルオプションを付与 arch={sm_20 sm_21 sm_30 sm_32 sm_35 sm_50 sm_52} エミュレーションモード 新しい CUDA(4.0 以降 ) では消滅 101

CPU プログラムの超簡単移植法 とりあえず GPU で実行すればいいのなら 拡張子を.cu に変更 GPU の都合を反映 関数の返値を void にし, global を付ける 関数名と引数の間に <<<1,1>>> を付ける GPU で使うメモリを cudamalloc で確保 malloc でメモリを確保していればそれを cudamalloc に置き換え GPU からデータを受け取るために cudamemcpy を追加 最適化は追々考えればいい カーネルの完成 102

Hello Thread(Fermi 世代以降 ) <<< >>> 内の数字で並列度が変わる この情報を利用すれば並列処理が可能 #include<stdio.h> global void hello(){ printf("hello Thread n"); } int main(void){ } hello<<<?,?>>>(); cudathreadsynchronize(); return 0; <<<>>> 内の数字を変えると画面表示される行数が変わる <<<1,8>>>, <<<8,1>>>, <<<4,2>>> 等 hellothread.cu 103

GPU の並列化の階層 GPU のハードウェアの構成に対応させて並列性を管理 並列化の各階層における情報を利用 ハードウェア構成 並列化の階層 CUDA GPU 並列に実行する処理 Grid Streaming Multiprocessor スレッドの集まり Block CUDA Core スレッド Thread 104

GPU の並列化の階層 グリッド - ブロック - スレッドの 3 階層 各階層の情報を参照できる変数 x,y,z をメンバにもつ dim3 型構造体 グリッド (Grid) griddim グリッド内にあるブロックの数 ブロック (Block) blockidx blockdim ブロックに割り当てられた番号ブロック内にあるスレッドの数 スレッド (Thread) threadidx スレッドに割り当てられた番号 105

Hello Threads(Fermi 世代以降 ) <<< >>> 内の数字で表示される内容が変化 #include<stdio.h> global void hello(){ printf("griddim.x=%d, blockidx.x=%d, blockdim.x=%d, threadidx.x=%d n", griddim.x, blockidx.x, blockdim.x, threadidx.x); } int main(void){ } hello<<<?,?>>>(); cudathreadsynchronize(); return 0; <<<>>> 内の数字を変えると画面表示される内容が変わる <<<>>> 内の数字とどのパラメータが対応しているかを確認 hellothreads.cu 106

GPU の構造とカーネルの書き方 GPUはマルチスレッド ( メニースレッド ) で並列処理 関数には1スレッドが実行する処理を書く 関数を実行する際に並列処理の度合いを指定 カーネルと引数の間に追加した <<<,>>> で並列処理の度合を指定 <<< グリッド内にあるブロックの数,1 ブロックあたりのスレッドの数 >>> 107

プログラム実習 以下のプログラムをコンパイルし, 正しく実行できることを確認せよ helloworld.c helloworld.cu hellothread.cu hellothreads.cu hellothreads.cu については,<<<>>> 内の数字を変更し, 実行結果がどのように変わるか確認せよ 108

レポート課題 1( 提出期限は 1 学期末 ) 二つの値を交換する関数 swap を GPU に移植せよ 並列化する必要はなく,1 スレッドで実行すればよい #include<stdio.h> void swap(int *addr_a, int *addr_b){ int c; //c は値を一時的に保持するための変数 c = *addr_a; //* は間接参照演算子 *addr_a = *addr_b; // メモリアドレス (=addr_a,addr_b の値 ) にある変数の値を参照 *addr_b = c; } int main(void){ int a=1,b=2; printf("a = %d, b = %d n", a, b); swap(&a, &b); // 変数 a, b のメモリアドレスを渡す.& はアドレス演算子 printf("a = %d, b = %d n", a, b); } return 0; swap.c 109

レポート課題 1( 提出期限は 1 学期末 ) #include<stdio.h> カーネルという目印 void swap(int *a, int *b){ } int main(void){ int a=1,b=2; GPU で使う変数を宣言? printf("a = %d, b = %d n", a, b); GPU 上のメモリを確保 (a の分 ) GPU 上のメモリを確保 (b の分 ) CPU から GPU にメモリの内容をコピー (a の分 ) CPU から GPU にメモリの内容をコピー (b の分 ) swap 実行時の並列度の指定 (GPU で使う変数, GPU で使う変数 ); GPU のメモリの内容を CPU にコピー (a の分 ) GPU のメモリの内容を CPU にコピー (b の分 ) printf("a = %d, b = %d n", a, b); } return 0; 110