SlideShare a Scribd company logo
第2回 GPUのアーキテクチャと
プログラム構造
長岡技術科学大学 電気電子情報工学専攻 出川智啓
今回の内容
2015/04/22GPGPU実践プログラミング2
 GPUのアーキテクチャ
 CUDA
 CUDAによるプログラミング
GPU(Graphics Processing Unit)とは
 画像処理専用のハードウェア
 具体的には画像処理用のチップ
 チップ単体では販売されていない
 PCI‐Exカードで販売
 チップ単体と区別せずにGPUと呼ぶことも多い
 ノートPCに搭載
 PCI‐Exカードとして販売されるGPUには,ビデオメモリと呼ばれ
るDRAMが搭載
2015/04/22GPGPU実践プログラミング3
GPU(Graphics Processing Unit)の役割
 グラフィックスを表示するために様々な処理を行い,処
理の結果をディスプレイに出力
 3次元グラフィックスの発展に伴って役割が大きく変化
3次元座標変換
ポリゴンとピクセルの
対応付け
ピクセル色計算
テクスチャ参照
フレームバッファ(ビデ
オメモリ)への書き込み
ディスプレイ出力
CPU
GPU
3次元座標変換
ポリゴンとピクセルの
対応付け
ピクセル色計算
テクスチャ参照
フレームバッファ(ビデ
オメモリ)への書き込み
ディスプレイ出力
現在過去
 CPUが3D描画
の演算を実行
 GPUが出力
描画情報
画面出力
 GPUが演算から
出力までの全て
を担当
 CPUは描画情報
の生成やGPUへ
の情報の引き渡
し , GPU の 制 御
を行う
描画情報
画面出力
2015/04/22GPGPU実践プログラミング4
ディスプレイコントローラ
GPUの描画の流れ
1. CPUからGPUへ描画情報を送信
2. 頂点処理(頂点シェーダ)
 座標変換
 画面上での頂点やポリゴンの位置・大きさの決定
 頂点単位での照明の計算
3. 頂点やポリゴンからピクセルを生成
(ラスタライザ)
4. ピクセル処理(ピクセルシェーダ)
 画面上のピクセルの色
 テクスチャの模様
5. 画面出力
 ピクセルの色情報をフレームバッファに書き込み
2.
3.
4.
2015/04/22GPGPU実践プログラミング5
ビデオカードからGPUへ
 CGの多様化と共に固定機能の実装が困難に
 頂点処理とピクセル処理をユーザが書き換えられるプロ
グラマブルシェーダの実装
頂点処理用回路
ピクセル処理用回路
グラフィックスカード
頂点シェーダユニット
ピクセルシェーダユニット
GPU
2015/04/22GPGPU実践プログラミング6
レンダリングパイプライン処理
2015/04/22GPGPU実践プログラミング7
頂点情報 光源情報
視野変換
陰影計算 材質情報
投影変換
クリッピング
ビューポート変換
走査変換
合成 テクスチャ
出力画像
投影像を画素
へ変換
整数演算とメモリ
アクセス
形状データの画面
への投影像
実数演算
レンダリングパイプライン処理
2015/04/22GPGPU実践プログラミング8
頂点情報 光源情報
視野変換
陰影計算 材質情報
投影変換
クリッピング
ビューポート変換
走査変換
合成 テクスチャ
出力画像
形状データの画面
への投影像
ハードウェアで処理
(固定機能)
実数演算
実数演算を行うハード
ウェアは高価だった
レンダリングパイプライン処理
2015/04/22GPGPU実践プログラミング9
頂点情報 光源情報
視野変換
陰影計算 材質情報
投影変換
クリッピング
ビューポート変換
走査変換
合成 テクスチャ
出力画像
ハードウェアで処理
(固定機能)
ハードウェアで処理
(固定機能)
レンダリングパイプライン処理
2015/04/22GPGPU実践プログラミング10
頂点情報
光源情報
視野変換
陰影計算
材質情報
投影変換
クリッピング
ビューポート変換
走査変換
合成 テクスチャ
出力画像
ピクセルシェーダ
頂点シェーダ
ビデオカードからGPUへ
 頂点処理とピクセル処理をユーザが書き換えられるプロ
グラマブルシェーダの実装
 処理によっては利用効率に差が生じる
GPU
頂点シェーダユニット
ピクセルシェーダユニット
頂点処理重視の処理
GPU
頂点シェーダユニット
ピクセルシェーダユニット
ピクセル処理重視の処理
空きユニット
空きユニット
2015/04/22GPGPU実践プログラミング11
ビデオカードからGPUへ
 頂点シェーダとピクセルシェーダを統合したユニファイド
シェーダへの進化
 頂点処理とピクセル処理を切り替えることで利用率を高める
GPU
ユニファイドシェーダユニット
頂点処理重視の処理 ピクセル処理重視の処理
GPU
ユニファイドシェーダユニット
2015/04/22GPGPU実践プログラミング12
ビデオカードからGPUへ
 各ピクセルに対して処理を並列に実行
 単純な処理を行う演算器(Streaming Processor, 
SP)を大量に搭載
 演算器は現在CUDA Coreという名称に変更
 高い並列度で処理を行う
2015/04/22GPGPU実践プログラミング13
Teslaアーキテクチャ*
2015/04/22GPGPU実践プログラミング14
 Tesla C1060の仕様
 SM数 30
 CUDA Core数 240(=8 Core/SM×30 SM)
 キャッシュを搭載せず
SP SP
SP SP
SP SP
SP SP
SFU SFU
16 KB
Shared Memory
Register File 
(16384×32‐bit)
Streaming 
Multiprocessor
SMSMSM
*CUDAのサポートから外れます
Teslaアーキテクチャ
2015/04/22GPGPU実践プログラミング15
 Tesla C1060の仕様
CUDAコア数(単精度) 240 Cores
CUDAコアクロック周波数 1,296 MHz
単精度演算ピーク性能 622*1
(933*2
) GFLOPS
倍精度演算ユニット数 30*3
Units
倍精度演算ピーク性能 78 GFLOPS
メモリクロック周波数 800 MHz
メモリバス幅 512 bit
最大メモリバンド幅*4
102 GB/s
*1単精度演算ピーク性能 = コアクロック周波数×コア数×命令の同時発行数(2)
*2CUDA CoreとSFUが同時に命令を発行できれば1296 MHz×240×3
*3一つのSMに倍精度演算器が一つ搭載(と言われている)
*4最大メモリバンド幅=メモリクロック周波数×メモリバス幅/8×2(Double Data Rate)
Fermiアーキテクチャ
2015/04/22GPGPU実践プログラミング16
 Tesla M2050の仕様
 SM数 14
 CUDA Core数 448(=32 Core/SM×14 SM)
 L1/L2 キャッシュを搭載
 ECC(誤り訂正機能)を搭載
Register File 
(16384 × 32‐bit)
64 KB Shared 
Memory / L1 Cache
SM
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
SFU×4
L2 Cache
GigaThread Engine
PCI Express 3.0 Host Interface
Memory Controller
GPC
Raster Engine
GPC
Raster Engine
SM
Raster Engine
GPC
Raster Engine
GPC
Memory ControllerMemory Controller
Memory ControllerMemory ControllerMemory Controller
詳細はhttp://www.nvidia.co.jp/docs/IO/
81860/NVIDIA_Fermi_Architecture_Whitep
aper_FINAL_J.pdfを参照のこと
Fermiアーキテクチャ
2015/04/22GPGPU実践プログラミング17
 Tesla M2050の仕様
CUDAコア数(単精度) 448 Cores
CUDAコアクロック周波数 1,150 MHz
単精度演算ピーク性能 1.03 TFLOPS
倍精度演算ユニット数 0*1 
Unit
倍精度演算ピーク性能 515 GFLOPS
メモリクロック周波数 1.55 GHz
メモリバス幅 384 bit
最大メモリバンド幅 148 GB/s
*1単精度CUDA Coreを2基使って倍精度演算を実行
Keplerアーキテクチャ
2015/04/22GPGPU実践プログラミング18
 Tesla K20c/mの仕様
 SMX数 13
 Streaming Multiprocessor eXtreme (?)
 CUDA Core数 2,496(=192 Core/SM×13 SMX)
Register File (65536 × 32‐bit)
64 KB Shared Memory / L1 Cache
48 KB Read‐Only Data Cache
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
SFU
SFU
SFU
SFU
SFU
SFU
SFU
SFU
SFU
SFU
SFU
SFU
SFU
SFU
SFU
SFU
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
SFU
SFU
SFU
SFU
SFU
SFU
SFU
SFU
SFU
SFU
SFU
SFU
SFU
SFU
SFU
SFU
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
SMX
SMX
L2 Cache
GigaThread Engine
PCI Express 3.0 Host Interface
Memory ControllerMemory ControllerMemory Controller
Memory ControllerMemory ControllerMemory Controller
詳細はhttps://www.nvidia.co.jp/content
/apac/pdf/tesla/nvidia‐kepler‐gk110‐ar
chitecture‐whitepaper‐jp.pdfを参照のこと
Keplerアーキテクチャ
2015/04/22GPGPU実践プログラミング19
 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
*164基/SMX×13基
Maxwellアーキテクチャ
 GeForce GTX TITAN Xの仕様
 SM数 24
 CUDA Core数 3,072(=128 Core/SM×24 SM)
2015/04/22GPGPU実践プログラミング20
64 KB Shared Memory 
L1 Cache
SMM
Register File 
(16,384 × 32‐
bit)
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
SFU
SFU
SFU
SFU
SFU
SFU
SFU
SFU
L1 Cache
Register File 
(16,384 × 32‐
bit)
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
SFU
SFU
SFU
SFU
SFU
SFU
SFU
SFU
Register File 
(16,384 × 32‐
bit)
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
SFU
SFU
SFU
SFU
SFU
SFU
SFU
SFU
Register File 
(16,384 × 32‐
bit)
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
SFU
SFU
SFU
SFU
SFU
SFU
SFU
SFU
PolyMorph Engine 3.0
SMM
Raster Engine
GPC
Raster Engine
GPC
L2 Cache
GigaThread Engine
PCI Express 3.0 Host Interface
Memory Controller
Raster Engine
GPC
Raster Engine
GPC
Memory Controller
Memory ControllerMemory Controller
第1世代の詳細はhttps://www.nvidia.co.jp/cont
ent/product‐detail‐pages/geforce‐gtx‐750‐ti
/geforce‐gtx‐750ti‐whitepaper.pdfを参照のこと
Maxwellアーキテクチャ
 GeForce GTX TITAN Xの仕様*
CUDAコア数(単精度) 3,072 Cores
CUDAコアクロック周波数 1,002 MHz
単精度演算ピーク性能 6.14 TFLOPS
倍精度演算ユニット数 0*1
Units
倍精度演算ピーク性能 192 GFLOPS*2
メモリクロック周波数 3.5 GHz*3
メモリバス幅 384 bit
最大メモリバンド幅 336.5 GB/s
*1http://www.4gamer.net/games/121/G012181/20141225075/
*2倍精度演算は単精度演算の性能の1/32 (1/16 Flop/Core/clock)
*3DDR(Double Data Rate) 7GHz相当と書かれている場合もある
2015/04/22GPGPU実践プログラミング21
http://http://www.geforce.com/hardware/desk
top‐gpus/geforce‐gtx‐titan‐x/specifications
*http://ja.wikipedia.org/wiki/FLOPS
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
2015/04/22GPGPU実践プログラミング22
*http://pc.watch.impress.co.jp/docs/column/kaigai/20150421_698806.html
Voltaアーキテクチャ*
 Pascalの後継
 詳しい情報は不明
 アメリカの次世代スーパーコンピュータへ採用予定
 オークリッジ国立研究所 SUMMIT 150~300PFLOPS
 ローレンス・リバモア研究所 SIERRA 100PFLOPS以上
 地球シミュレータと同等の演算性能を1ノードで実現
 現在Top500 2位のスーパーコンピュータと同じ電力で5~10
倍高速,サイズは1/5
2015/04/22GPGPU実践プログラミング23
*http://www.4gamer.net/games/121/G012181/20141225075/
CUDA 
Core
CUDA 
Core
CUDA 
Core
CUDA 
Core
CUDA 
Core
CUDA 
Core
CUDA 
Core
CUDA 
Core
Streaming 
Multiprocessor
GPUの模式図
2015/04/22GPGPU実践プログラミング24
GPU
Streaming 
Multiprocessor
L2キャッシュ
コンスタントメモリ
テクスチャメモリ
GPU
Chip
グローバルメモリ
SM SM SM SM・・・
・・・SM SM SM SM・・・ レジ
スタ
レジ
スタ
レジ
スタ
レジ
スタ
CUDA 
Core
CUDA 
Core
CUDA 
Core
CUDA 
Core
L1キャッ
シュ
共有
メモリ
Streaming
Multiprocessor
SM SM SM SM・・・
ローカル
メモリ
ローカル
メモリ ・・・
ローカル
メモリ
ローカル
メモリ ・・・
GPUの並列化の階層
 グリッド-ブロック-スレッドの3階層
 グリッド(Grid)
 並列に実行する処理
 GPUが処理を担当する領域全体
 スレッド(Thread)
 GPUの処理の基本単位
 CPUのスレッドと同じ
 ブロック(Block)もしくはスレッドブロック(Thread Block)*
 スレッドの集まり
2015/04/22GPGPU実践プログラミング25
*スレッドブロックだと長い上にスレッドや変数名
との兼ね合いで混乱を招くのでブロックで統一
GPUの並列化の階層
 GPUのハードウェアの構成に対応させて並列性を管理
GPU
Streaming 
Multiprocessor
CUDA 
Core
ハードウェア構成
並列に実行する
処理
スレッドの集
まり
スレッド
並列化の階層
Grid
Block
Thread
CUDA
2015/04/22GPGPU実践プログラミング26
CUDA
 Compute Unified Device Architecture
 NVIDIA社製GPU向け開発環境(Windows,Linux,Mac OS X)
 2007年頃発表
 C/C++言語+独自のGPU向け拡張
 専用コンパイラ(nvcc)とランタイムライブラリ
 いくつかの数値計算ライブラリ(線形代数計算,FFTなど)
 CUDA登場以前
 グラフィックスプログラミングを利用
 足し算を行うために,色を混ぜる処理を実行
 汎用計算のためには多大な労力が必要
2015/04/22GPGPU実践プログラミング27
CUDAによるプログラミング
 CPUをホスト(Host),GPUをデバイス(Device)と表現
 ホスト(CPU)
 処理の流れやGPUを利用するための手続きを記述
 プログラムの書き方は従来のC言語と同じ
 利用するGPUの決定,GPUへのデータ転送,GPUで実行する関
数の呼び出し等
2015/04/22GPGPU実践プログラミング28
CUDAによるプログラミング
 CPUをホスト(Host),GPUをデバイス(Device)と表現
 デバイス(GPU)
 処理する内容を関数として記述
 引数は利用可能,返値は利用不可(常にvoid)
 関数はkernelと呼ばれる
 関数呼び出しはlaunch, invokeなどと呼ばれる
2015/04/22GPGPU実践プログラミング29
Hello World
 何を確認するか
 最小構成のプログラムの作り方
 ファイル命名規則(拡張子は.c/.cpp)
 コンパイルの方法(gcc, cl等を使用)
#include<stdio.h>
int main(void){
printf("hello world¥n");
return 0;
}
2015/04/22GPGPU実践プログラミング30
helloworld.c
CUDAでHello World
 何を確認するか
 最小構成のプログラムの作り方
 ファイル命名規則(拡張子は.cu)
 コンパイルの方法(nvccを使用)
#include<stdio.h>
int main(void){
printf("hello world¥n");
return 0;
}
2015/04/22GPGPU実践プログラミング31
#include<stdio.h>
int main(void){
printf("hello world¥n");
return 0;
}
違いは拡張子だけ?
helloworld.cu helloworld.c
CUDAプログラムのコンパイル
 ソースファイルの拡張子は.cu
 nvccを用いてコンパイル
 CPUが処理する箇所はgcc等がコンパイル
 GPUで処理する箇所をnvccがコンパイル
 helloworld.cuにはCPUで処理する箇所しかない
2015/04/22GPGPU実践プログラミング32
CUDAでHello World
 CUDA専用の処理を追加
2015/04/22GPGPU実践プログラミング33
#include<stdio.h>
__global__ void kernel(){}
int main(void){
kernel<<<1,1>>>();
printf("hello world¥n");
return 0;
}
GPUで実行される関数(カーネル)
__global__が追加されている
・・・
通常の関数呼出とは異なり,
<<<,>>>が追加されている
・・・
helloworld_kernel.cu
CUDAプログラムの実行
 実行時の流れ(CPU視点)
 利用するGPUの初期化やデータの転送などを実行
 GPUで実行する関数を呼び出し
 GPUから結果を取得
初期化の指示
初期化
カーネルの実行指示
カーネルを実行
結果の取得
実行結果をコピー
time
CPUとGPUは非同期
CPUは別の処理を実行可能
2015/04/22GPGPU実践プログラミング34
必要なデータのコピー
メモリに書込
GPUの構造とカーネルの書き方
 プログラムからGPUで実行する関数を呼出
 GPUで実行する関数という目印が必要
 GPUはPCI‐Exバスを経由してホストと接続
 GPUはホストと別に独立したメモリを持つ
 関数の実行に必要なデータはGPUのメモリに置く
 GPUはマルチスレッド(メニースレッド)で並列処理
 関数には1スレッドが実行する処理を書く
 関数を実行する際に並列処理の度合いを指定
2015/04/22GPGPU実践プログラミング35
GPUの構造とカーネルの書き方
 GPUで実行する関数(カーネル)という目印
 修飾子__global__を付ける
 GPUはPCI‐Exバスを経由してホストと接続
 GPUはホストと別に独立したメモリを持つ
 カーネルの返値をvoidにする
 GPUはマルチスレッド(メニースレッド)で並列処理
 カーネルには1スレッドが実行する処理を書く
 カーネル名と引数の間に<<<1,1>>>を付ける
2015/04/22GPGPU実践プログラミング36
Hello Thread(Fermi世代以降)
 GPUの各スレッドが画面表示
2015/04/22GPGPU実践プログラミング37
#include<stdio.h>
__global__ void hello(){
printf("Hello Thread¥n");
}
int main(void){
hello<<<1,1>>>();
cudaDeviceSynchronize();
return 0;
}
画面表示(Fermi世代以降で可能)
コンパイル時にオプションが必要
‐arch=sm_20以降
・・・
カーネル実行・・・
ホストとデバイスの同期をとる
CPUとGPUは原則同期しないので,
同期しないとカーネルを実行した
直後にプログラムが終了
・・・
hellothread.cu
Hello Thread(Fermi世代以降)
 <<<,>>>内の数字で並列度が変わることの確認
2015/04/22GPGPU実践プログラミング38
#include<stdio.h>
__global__ void hello(){
printf("Hello Thread¥n");
}
int main(void){
hello<<<?,?>>>();
cudaDeviceSynchronize();
return 0;
}
<<<,>>>内の数字を変えると画
面表示される行数が変わる
<<<1,8>>>, <<<8,1>>>, 
<<<4,2>>>等
・・・
hellothread.cu
CPUとGPUのやりとり
2015/04/22GPGPU実践プログラミング39
 GPUの想定される使い方
 ホスト(CPU)からデータを送り,デバイス(GPU)で計算し,
結果を受け取る
 CPUとGPUのデータのやり取りが必要
 GPUは原則データを返さない
 描画情報を受け取り,画面に出力
 カーネルの返値がvoidの理由
描画情報
画面出力
CPUとGPUのやりとり
2015/04/22GPGPU実践プログラミング40
 CUDA独自の命令とC言語のポインタを利用
 GPUのメモリ上に計算に必要なサイズを確保
 確保したメモリのアドレスをC言語のポインタで格納
 ポインタの情報を基にデータを送受信
ポインタ変数
メモリ
メモリ
CUDAを介して
データを送受信
データ
データ
CPUとGPUのやり取り(単純な加算)
2015/04/22GPGPU実践プログラミング41
 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
CPUとGPUのやり取り(単純な加算)
2015/04/22GPGPU実践プログラミング42
 関数の返値をvoidに変更し,メモリの動的確保を使用
#include<stdio.h>
#include<stdlib.h>
void add(int a, int b, int *c){
*c = a + b;
}
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;
}
引数で渡された変数の和を,cが指す
アドレスに書き込み
・・・
引数にアドレスを追加・・・
アドレスを基に結果を参照・・・
add.c
CPUプログラム(メモリの動的確保)
2015/04/22GPGPU実践プログラミング43
 malloc
 指定したバイト数分のメモリを確保
 stdlib.hをインクルードする必要がある
 sizeof
 データ型1個のサイズ(バイト数)を求める
#include<stdlib.h>
int *a;
a = (int *)malloc( sizeof(int)*100 );
printf("%d, %d¥n", sizeof(float), sizeof(double));
実行すると4,8と表示される
CPUとGPUのやり取り(単純な加算)
2015/04/22GPGPU実践プログラミング44
 add.cの処理の一部をGPUの処理に置き換え
#include<stdio.h>
__global__ void add(int a, int b, int *c){
*c = a + b;
}
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;
}
__global__を追加・・・
GPU上のメモリに確保される変数のアドレス・・・
GPU上にint型変数
一個分のメモリを確保
・・・
↑GPUから結果をコピー
メモリを解放・・・
add.cu
CUDAでカーネルを作成するときの制限
2015/04/22GPGPU実践プログラミング45
 カーネルの引数
 値を渡すことができる
 GPUのメモリを指すアドレス
 CPUのメモリを指すアドレスも渡すことは可能
 そのアドレスを基にホスト側のメモリを参照することは不可能
 printfなどの画面出力
 Fermi世代以降のGPUで,コンパイルオプションを付与
 ‐arch={sm_20|sm_21|sm_30|sm_32|sm_35|sm_50|sm_52}
 エミュレーションモード
 CUDA4.0以降では消滅
CPUプログラムの超簡単移植法
 とりあえずGPUで実行すればいいのなら・・・
 拡張子を.cuに変更
 GPUの都合を反映
 関数の返値をvoidにし,__global__を付ける
 関数名と引数の間に<<<1,1>>>を付ける
 GPUで使うメモリをcudaMallocで確保
 mallocでメモリを確保していればそれをcudaMallocに置き換え
 GPUからデータを受け取るためにcudaMemcpyを追加
 最適化は追々考えればいい
2015/04/22GPGPU実践プログラミング46
カーネルの完成
Hello Thread(Fermi世代以降)
 <<<,>>>内の数字で並列度が変わる
 この情報を利用すれば並列処理が可能
2015/04/22GPGPU実践プログラミング47
#include<stdio.h>
__global__ void hello(){
printf("Hello Thread¥n");
}
int main(void){
hello<<<?,?>>>();
cudaDeviceSynchronize();
return 0;
}
<<<,>>>内の数字を変えると画面表
示される行数が変わる
<<<1,8>>>, <<<8,1>>>, 
<<<4,2>>>等
・・・
hellothread.cu
GPUの並列化の階層
 GPUのハードウェアの構成に対応させて並列性を管理
 並列化の各階層における情報を利用
GPU
Streaming 
Multiprocessor
CUDA 
Core
ハードウェア構成
並列に実行する
処理
スレッドの集
まり
スレッド
並列化の階層
Grid
Block
Thread
CUDA
2015/04/22GPGPU実践プログラミング48
GPUの並列化の階層
 グリッド-ブロック-スレッドの3階層
 各階層の情報を参照できる変数
 x,y,zをメンバにもつdim3型構造体
 グリッド(Grid)
 gridDim グリッド内にあるブロックの数
 ブロック(Block)
 blockIdx ブロックに割り当てられた番号
 blockDim ブロック内にあるスレッドの数
 スレッド(Thread)
 threadIdx スレッドに割り当てられた番号
2015/04/22GPGPU実践プログラミング49
Hello Threads(Fermi世代以降)
 <<<,>>>内の数字で表示される内容が変化
2015/04/22GPGPU実践プログラミング50
#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<<<?,?>>>();
cudaDeviceSynchronize();
return 0;
}
<<<,>>>内の数字を変えると画面表
示される内容が変わる
<<<,>>>内の数字とどのパラメータが
対応しているかを確認
・・・
hellothreads.cu
GPUの構造とカーネルの書き方
 GPUはマルチスレッド(メニースレッド)で並列処理
 関数には1スレッドが実行する処理を書く
 関数を実行する際に並列処理の度合いを指定
 カーネルと引数の間に追加した<<<,>>>で並列処理の
度合を指定
 <<<グリッド内にあるブロックの数,1ブロックあたりのスレッド
の数>>>
2015/04/22GPGPU実践プログラミング51

More Related Content

PDF
2015年度GPGPU実践プログラミング 第1回 GPGPUの歴史と応用例
PDF
2015年度GPGPU実践プログラミング 第4回 GPUでの並列プログラミング(ベクトル和,移動平均,差分法)
PDF
2015年度GPGPU実践プログラミング 第5回 GPUのメモリ階層
PDF
2015年度GPGPU実践プログラミング 第9回 行列計算(行列-行列積)
PDF
2015年度GPGPU実践基礎工学 第10回 GPUのプログラム構造
PDF
GPGPU Seminar (GPU Accelerated Libraries, 3 of 3, Thrust)
PDF
2015年度GPGPU実践基礎工学 第13回 GPUのメモリ階層
PDF
1072: アプリケーション開発を加速するCUDAライブラリ
2015年度GPGPU実践プログラミング 第1回 GPGPUの歴史と応用例
2015年度GPGPU実践プログラミング 第4回 GPUでの並列プログラミング(ベクトル和,移動平均,差分法)
2015年度GPGPU実践プログラミング 第5回 GPUのメモリ階層
2015年度GPGPU実践プログラミング 第9回 行列計算(行列-行列積)
2015年度GPGPU実践基礎工学 第10回 GPUのプログラム構造
GPGPU Seminar (GPU Accelerated Libraries, 3 of 3, Thrust)
2015年度GPGPU実践基礎工学 第13回 GPUのメモリ階層
1072: アプリケーション開発を加速するCUDAライブラリ

What's hot (20)

PDF
2015年度先端GPGPUシミュレーション工学特論 第7回 総和計算(Atomic演算)
PDF
2015年度先端GPGPUシミュレーション工学特論 第15回 CPUとGPUの協調
PDF
2015年度先端GPGPUシミュレーション工学特論 第8回 偏微分方程式の差分計算 (拡散方程式)
PDF
CUDAプログラミング入門
PDF
2015年度GPGPU実践基礎工学 第6回 ソフトウェアによるCPUの高速化技術
PDF
2015年度先端GPGPUシミュレーション工学特論 第5回 GPUのメモリ階層の詳細 (様々なメモリの利用)
PDF
GPGPU Seminar (PyCUDA)
PDF
2015年度GPGPU実践プログラミング 第10回 行列計算(行列-行列積の高度な最適化)
PDF
2015年度先端GPGPUシミュレーション工学特論 第2回 GPUによる並列計算の概念と メモリアクセス
PDF
2015年度先端GPGPUシミュレーション工学特論 第9回 偏微分方程式の差分計算 (移流方程式)
PDF
2015年度GPGPU実践プログラミング 第6回 パフォーマンス解析ツール
PDF
GPGPU Seminar (GPGPU and CUDA Fortran)
PDF
2015年度GPGPU実践基礎工学 第12回 GPUによる画像処理
PDF
プログラムを高速化する話Ⅱ 〜GPGPU編〜
PDF
1076: CUDAデバッグ・プロファイリング入門
PDF
2015年度先端GPGPUシミュレーション工学特論 第4回 GPUのメモリ階層の詳細 (共有メモリ)
PPTX
[DL輪読会]PointNet++: Deep Hierarchical Feature Learning on Point Sets in a Metr...
PDF
C++による数値解析の並列化手法
PDF
いまさら聞けない!CUDA高速化入門
PDF
CUDAのアセンブリ言語基礎のまとめ PTXとSASSの概説
2015年度先端GPGPUシミュレーション工学特論 第7回 総和計算(Atomic演算)
2015年度先端GPGPUシミュレーション工学特論 第15回 CPUとGPUの協調
2015年度先端GPGPUシミュレーション工学特論 第8回 偏微分方程式の差分計算 (拡散方程式)
CUDAプログラミング入門
2015年度GPGPU実践基礎工学 第6回 ソフトウェアによるCPUの高速化技術
2015年度先端GPGPUシミュレーション工学特論 第5回 GPUのメモリ階層の詳細 (様々なメモリの利用)
GPGPU Seminar (PyCUDA)
2015年度GPGPU実践プログラミング 第10回 行列計算(行列-行列積の高度な最適化)
2015年度先端GPGPUシミュレーション工学特論 第2回 GPUによる並列計算の概念と メモリアクセス
2015年度先端GPGPUシミュレーション工学特論 第9回 偏微分方程式の差分計算 (移流方程式)
2015年度GPGPU実践プログラミング 第6回 パフォーマンス解析ツール
GPGPU Seminar (GPGPU and CUDA Fortran)
2015年度GPGPU実践基礎工学 第12回 GPUによる画像処理
プログラムを高速化する話Ⅱ 〜GPGPU編〜
1076: CUDAデバッグ・プロファイリング入門
2015年度先端GPGPUシミュレーション工学特論 第4回 GPUのメモリ階層の詳細 (共有メモリ)
[DL輪読会]PointNet++: Deep Hierarchical Feature Learning on Point Sets in a Metr...
C++による数値解析の並列化手法
いまさら聞けない!CUDA高速化入門
CUDAのアセンブリ言語基礎のまとめ PTXとSASSの概説
Ad

Viewers also liked (20)

PDF
2015年度GPGPU実践プログラミング 第13回 多粒子の運動
PDF
2015年度GPGPU実践基礎工学 第1回 学際的分野における先端シミュレーション技術の歴史
PDF
2015年度GPGPU実践プログラミング 第7回 総和計算
PDF
2015年度GPGPU実践プログラミング 第11回 画像処理
PDF
2015年度GPGPU実践プログラミング 第14回 N体問題
PDF
2015年度GPGPU実践基礎工学 第4回 CPUのアーキテクチャ
PDF
2015年度GPGPU実践プログラミング 第8回 総和計算(高度な最適化)
PDF
2015年度GPGPU実践基礎工学 第3回 GPUクラスタ上でのプログラミング(CUDA)
PDF
2015年度GPGPU実践プログラミング 第12回 偏微分方程式の差分計算
PDF
2015年度GPGPU実践基礎工学 第7回 シングルコアとマルチコア
PDF
2015年度GPGPU実践基礎工学 第9回補足 GROUSEの利用方法
PDF
2015年度GPGPU実践基礎工学 第8回 並列計算の概念 (プロセスとスレッド)
PDF
2015年度GPGPU実践プログラミング 第15回 GPU最適化ライブラリ
PDF
2015年度GPGPU実践基礎工学 第5回 ハードウェアによるCPUの高速化技術
PDF
2015年度GPGPU実践プログラミング 第3回 GPGPUプログラミング環境
PDF
2015年度GPGPU実践基礎工学 第2回 GPGPUの歴史と応用例
PDF
2015年度GPGPU実践基礎工学 第11回 GPUでの並列 プログラミング(ベクトル和)
PDF
2015年度GPGPU実践基礎工学 第15回 GPGPU開発環境 (OpenCL)
PDF
2015年度GPGPU実践基礎工学 第9回 GPUのアーキテクチャ
PDF
2015年度GPGPU実践基礎工学 第14回 GPGPU組込開発環境
2015年度GPGPU実践プログラミング 第13回 多粒子の運動
2015年度GPGPU実践基礎工学 第1回 学際的分野における先端シミュレーション技術の歴史
2015年度GPGPU実践プログラミング 第7回 総和計算
2015年度GPGPU実践プログラミング 第11回 画像処理
2015年度GPGPU実践プログラミング 第14回 N体問題
2015年度GPGPU実践基礎工学 第4回 CPUのアーキテクチャ
2015年度GPGPU実践プログラミング 第8回 総和計算(高度な最適化)
2015年度GPGPU実践基礎工学 第3回 GPUクラスタ上でのプログラミング(CUDA)
2015年度GPGPU実践プログラミング 第12回 偏微分方程式の差分計算
2015年度GPGPU実践基礎工学 第7回 シングルコアとマルチコア
2015年度GPGPU実践基礎工学 第9回補足 GROUSEの利用方法
2015年度GPGPU実践基礎工学 第8回 並列計算の概念 (プロセスとスレッド)
2015年度GPGPU実践プログラミング 第15回 GPU最適化ライブラリ
2015年度GPGPU実践基礎工学 第5回 ハードウェアによるCPUの高速化技術
2015年度GPGPU実践プログラミング 第3回 GPGPUプログラミング環境
2015年度GPGPU実践基礎工学 第2回 GPGPUの歴史と応用例
2015年度GPGPU実践基礎工学 第11回 GPUでの並列 プログラミング(ベクトル和)
2015年度GPGPU実践基礎工学 第15回 GPGPU開発環境 (OpenCL)
2015年度GPGPU実践基礎工学 第9回 GPUのアーキテクチャ
2015年度GPGPU実践基礎工学 第14回 GPGPU組込開発環境
Ad

Similar to 2015年度GPGPU実践プログラミング 第2回 GPUのアーキテクチャとプログラム構造 (19)

PDF
1070: CUDA プログラミング入門
PDF
2015年度先端GPGPUシミュレーション工学特論 第3回 GPUプログラム構造の詳細 (threadとwarp)
PDF
Hello, DirectCompute
KEY
NVIDIA Japan Seminar 2012
PDF
Maxwell と Java CUDAプログラミング
PDF
GPGPU Education at Nagaoka University of Technology: A Trial Run
PDF
2009/12/10 GPUコンピューティングの現状とスーパーコンピューティングの未来
PDF
【旧版】2009/12/10 GPUコンピューティングの現状とスーパーコンピューティングの未来
PDF
Lisp Meet Up #19, cl-cuda: a library to use NVIDIA CUDA in Common Lisp
PPTX
OpenGL ES2.0 一問一答
PDF
CUDA1日(?)体験会
PDF
CMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティング
DOC
GPGPUによるパーソナルスーパーコンピュータの可能性
PDF
技術系大学におけるGPU教育の一試行
PPTX
GPGPU - GPUによる汎用計算
PDF
CUDA1日(?)体験会 (再アップロード)
PPTX
きれいな絵を書こうとしていたら、Aiを作れる様になっていた話
KEY
関東GPGPU勉強会 LLVM meets GPU
1070: CUDA プログラミング入門
2015年度先端GPGPUシミュレーション工学特論 第3回 GPUプログラム構造の詳細 (threadとwarp)
Hello, DirectCompute
NVIDIA Japan Seminar 2012
Maxwell と Java CUDAプログラミング
GPGPU Education at Nagaoka University of Technology: A Trial Run
2009/12/10 GPUコンピューティングの現状とスーパーコンピューティングの未来
【旧版】2009/12/10 GPUコンピューティングの現状とスーパーコンピューティングの未来
Lisp Meet Up #19, cl-cuda: a library to use NVIDIA CUDA in Common Lisp
OpenGL ES2.0 一問一答
CUDA1日(?)体験会
CMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティング
GPGPUによるパーソナルスーパーコンピュータの可能性
技術系大学におけるGPU教育の一試行
GPGPU - GPUによる汎用計算
CUDA1日(?)体験会 (再アップロード)
きれいな絵を書こうとしていたら、Aiを作れる様になっていた話
関東GPGPU勉強会 LLVM meets GPU

More from 智啓 出川 (18)

PDF
Fortranが拓く世界、VSCodeが架ける橋
PDF
Very helpful python code to find coefficients of the finite difference method
PDF
Why do we confuse String and Array of Characters in Fortran?
PDF
Pythonによる累乗近似
PDF
数値計算結果のPythonによる後処理について(1次元データのピーク値およびその位置の推定)
PDF
オブジェクト指向Fortranが拓く(はずだった)新しい世界
PPTX
Schematic diagrams of GPUs' architecture and Time evolution of theoretical FL...
PDF
GPGPU Seminar (GPU Accelerated Libraries, 2 of 3, cuSPARSE)
PDF
GPGPU Seminar (GPU Accelerated Libraries, 1 of 3, cuBLAS)
PDF
Cuda fortranの利便性を高めるfortran言語の機能
PDF
PGI CUDA FortranとGPU最適化ライブラリの一連携法
PPTX
教育機関でのJetsonの活用の可能性
PDF
GPGPU Seminar (Accelerataion of Lattice Boltzmann Method using CUDA Fortran)
PDF
2015年度先端GPGPUシミュレーション工学特論 第14回 複数GPUの利用
PDF
2015年度先端GPGPUシミュレーション工学特論 第13回 数値流体力学への応用 (高度な最適化)
PDF
2015年度先端GPGPUシミュレーション工学特論 第11回 数値流体力学への応用 (支配方程式,CPUプログラム)
PDF
2015年度先端GPGPUシミュレーション工学特論 第10回 Poisson方程式の求解 (線形連立一次方程式)
PDF
2015年度先端GPGPUシミュレーション工学特論 第6回 プログラムの性能評価指針 (Flop/Byte,計算律速,メモリ律速)
Fortranが拓く世界、VSCodeが架ける橋
Very helpful python code to find coefficients of the finite difference method
Why do we confuse String and Array of Characters in Fortran?
Pythonによる累乗近似
数値計算結果のPythonによる後処理について(1次元データのピーク値およびその位置の推定)
オブジェクト指向Fortranが拓く(はずだった)新しい世界
Schematic diagrams of GPUs' architecture and Time evolution of theoretical FL...
GPGPU Seminar (GPU Accelerated Libraries, 2 of 3, cuSPARSE)
GPGPU Seminar (GPU Accelerated Libraries, 1 of 3, cuBLAS)
Cuda fortranの利便性を高めるfortran言語の機能
PGI CUDA FortranとGPU最適化ライブラリの一連携法
教育機関でのJetsonの活用の可能性
GPGPU Seminar (Accelerataion of Lattice Boltzmann Method using CUDA Fortran)
2015年度先端GPGPUシミュレーション工学特論 第14回 複数GPUの利用
2015年度先端GPGPUシミュレーション工学特論 第13回 数値流体力学への応用 (高度な最適化)
2015年度先端GPGPUシミュレーション工学特論 第11回 数値流体力学への応用 (支配方程式,CPUプログラム)
2015年度先端GPGPUシミュレーション工学特論 第10回 Poisson方程式の求解 (線形連立一次方程式)
2015年度先端GPGPUシミュレーション工学特論 第6回 プログラムの性能評価指針 (Flop/Byte,計算律速,メモリ律速)

2015年度GPGPU実践プログラミング 第2回 GPUのアーキテクチャとプログラム構造