• 検索結果がありません。

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

N/A
N/A
Protected

Academic year: 2021

シェア "Microsoft PowerPoint - GPGPU実践基礎工学(web).pptx"

Copied!
37
0
0

読み込み中.... (全文を見る)

全文

(1)

長岡技術科学大学 電気電子情報工学専攻 出川智啓

(2)

今回の内容

GPUプログラミング環境(CUDA)

GPUプログラムの実行の流れ

CUDAによるプログラムの記述

 カーネル(GPUで処理する関数)の構造  記述方法とその理由 

GPU固有のパラメータの確認

(3)

GPU(Graphics Processing Unit)とは

画像処理専用のハードウェア

 具体的には画像処理用のチップ  チップ単体では販売されていない  PCI‐Exカードで販売(チップ単体と区別せずにGPUと呼ぶことも多い)  マザーボードやノートPCに搭載  PCI‐Exカードとして販売されるGPUには,ビデオメモリと呼ばれ るRAMが搭載

(4)

GPUのハードウェア構造

CUDA Core(旧Streaming Processor, SP)と呼ばれ

る演算器を多数搭載

Streaming Multiprocessor(SM, SMX)が複数の

CUDA CoreとSFU,メモリをまとめて管理

SFU(Special Function Unit)  数学関数を計算するユニット 

複数のSMが集まってGPUを構成

(5)

Fermiアーキテクチャの構造

Tesla M2050の仕様

SM数 14CUDA Core数 448(=32 Core/SM×14 SM)  動作周波数 1,150 MHz  単精度演算ピーク性能 1.03 TFLOPS

(6)

CUDA  CoreCUDA CoreCUDA CoreCUDA 

CoreCUDA CoreCUDA  CoreCUDA CoreCUDA Core

Streaming  Multiprocessor

GPUの模式図

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

(7)

CUDA

Compute Unified Device Architecture

NVIDIA社製GPU向け開発環境(Windows,Linux,Mac OS X)2007年頃発表C/C++言語+独自のGPU向け拡張  専用コンパイラ(nvcc)とランタイムライブラリ  いくつかの数値計算ライブラリ(線形代数計算,FFTなど) 

CUDA登場以前

 グラフィクスプログラミングを利用  足し算を行うために,色を混ぜる処理を実行  汎用計算のためには多大な労力が必要

(8)

プログラマブルシェーダを用いた汎用計算

グラフィックスAPI(DirectX, OpenGL)による描画処理

+シェーダ言語(HLSL, GLSL)による演算

void gpumain(){

vec4 ColorA = vec4(0.0, 0.0, 0.0, 0.0); vec4 ColorB = vec4(0.0, 0.0, 0.0, 0.0); vec2 TexA = vec2(0.0, 0.0); vec2 TexB = vec2(0.0, 0.0);

TexA.x = gl_FragCoord.x; TexA.y = gl_FragCoord.y; TexB.x = gl_FragCoord.x; TexB.y = gl_FragCoord.y; ColorA = texRECT( texUnit0, TexA );

ColorB = texRECT( texUnit1, TexB );

gl_FragColor = F_ALPHA*ColorA + F_BETA*ColorB; } void main(){ glutInit( &argc, argv ); glutInitWindowSize(64,64);glutCreateWindow("GpgpuHelloWorld"); glGenFramebuffersEXT(1, &g_fb); glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, g_fb); glGenTextures(4, g_nTexID); // create (reference to) a new texture glBindTexture(opt1, texid); glTexParameteri(opt1, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(...); glTexImage2D(opt1, 0, opt2, width, height, 0, GL_RGBA, GL_FLOAT, 0); GPUの処理(GLSL) 各ピクセルに対して実行 CPUの処理 (OpenGL) シェーダ言語を用いた配列加算 (c=*a + *b)の例

(9)

CUDAによるプログラミング

CPUをホスト(Host),GPUをデバイス(Device)と表現

ホスト(CPU)

 処理の流れやGPUを利用するための手続きを記述  プログラムの書き方は従来のC言語と同じ  利用するGPUの決定,GPUへのデータ転送,GPUで実行する関 数の呼び出し等

(10)

CUDAによるプログラミング

CPUをホスト(Host),GPUをデバイス(Device)と表現

デバイス(GPU)

 処理する内容を関数として記述  引数は利用可能,返値は利用不可(常にvoid)  関数はkernelと呼ばれる  関数呼び出しはlaunch, invokeなどと呼ばれる

(11)

Hello World

何を確認するか

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

(12)

CUDAでHello World

何を確認するか

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

(13)

CUDAプログラムのコンパイル

ソースファイルの拡張子は

.cu

nvccを用いてコンパイル

CPUが処理する箇所はgcc等がコンパイルGPUで処理する箇所をnvccがコンパイル

helloworld.cuにはCPUで処理する箇所しかない

(14)

CUDAでHello World

CUDA専用の処理を追加

#include<stdio.h> __global__ void kernel(){} int main(void){ kernel<<<1,1>>>(); printf("hello world¥n"); return 0; } GPUで実行される関数(カーネル) __global__が追加されている ・・・ 通常の関数呼出とは異なり, <<<>>>が追加されている ・・・ hellokernel.cu

(15)

CUDAプログラムの実行

実行時の流れ

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

CPU

GPU

(16)

Hello Thread(Fermi世代以降)

printfをGPUから呼び出し,並列に実行

#include<stdio.h> int hello(){ printf("Hello Thread¥n"); return 0; } int main(void){ hello(); return 0; } 画面表示 ・・・ 関数呼び出し ・・・ hellothread.c

(17)

Hello Thread(Fermi世代以降)

GPUの各スレッドが画面表示

#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

(18)

CUDAでカーネルを作成するときの制限

printfによる画面出力

Fermi世代以降のGPUで,コンパイルオプションを付与‐arch={sm_20|sm_21|sm_30|sm_32|sm_35|sm_50|sm_52}  エミュレーションモード  GPUの動作(並列実行)をCPUで模擬CUDA4.0以降では消滅

オプション付きのコンパイル

nvcc ‐arch=sm_20 hellothread.cu

(19)

GPUプログラムへの変更

変更点

(20)

変更の理由

変更点

 関数の前に修飾子__global__をつけた 

変更によって実現されること

GPUで実行する関数という目印になる

変更が必要な理由

 ホスト(CPU)からGPUで実行する関数(カーネル)を呼び出し  CPUが処理する箇所とGPUが処理する箇所は別のコンパイラ がコンパイル  コンパイルの時点でどれがカーネルかを明記

(21)

GPUプログラムへの変更

変更点

(22)

変更の理由

変更点

 関数helloの返値をvoidにした 

変更によって実現されること

GPUのハードウェア構造に適したプログラムを作成できる

変更が必要な理由

GPUはホストと別に独立したメモリを持つGPUは描画情報を受け取り,画面に出力GPU→CPUの頻繁なデータ転送は苦手  プログラマがメモリ管理を行い,無駄なデータ転送による実行 描画情報 画面出力

(23)

GPUプログラムへの変更

変更点

(24)

変更の理由

変更点

 関数呼出の際に関数名と引数の間に<<<1,1>>>を付けた 

変更によって実現されること

GPUのハードウェア構造に適したプログラムを作成できる

変更が必要な理由

GPUには数百から数千のCUDAコアが搭載されており,それらが 協調して並列処理を実行  1スレッドが実行する処理を書くことでカーネルの作成を簡略化  並列処理の度合いはカーネル呼出の際に指定

(25)

GPUプログラムへの変更

変更点

(26)

変更の理由

変更点

 カーネルを呼び出した後に同期を取る関数を呼んだ 

変更によって実現されること

GPUで実行した結果が正しく得られる

変更が必要な理由

CPUとGPUは非同期に処理を実行  関数を呼んでCPU側に制御が戻った直後にreturn 0でプログ ラムが終了(画面表示が行われない)  正しい結果を得るためにカーネルの終了を待つ

(27)

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

(28)

<<<,>>>内の2個の数字の意味は?

GPUのハードウェアの構成に対応させて並列性を管理

各階層における並列実行の度合を指定

<<<,>>>内に2個の数字を記述して,各階層の並列度を指定 GPU Streaming  Multiprocessor CUDA  Core ハードウェア構成 並列に実行する 処理 スレッドの集 まり スレッド 並列化の階層 Grid Thread  Block Thread CUDA

(29)

GPUの並列化の階層

グリッド-ブロック-スレッドの3階層

グリッド(Grid)

 並列に実行する処理  GPUが処理を担当する領域全体

スレッド(Thread)

GPUの処理の基本単位CPUのスレッドと同じ

ブロック(Block)もしくはスレッドブロック(Thread Block)*

 スレッドの集まり

(30)

GPUの並列化の階層

各階層の情報を参照できる変数

x,y,zをメンバにもつdim3型構造体

グリッド(Grid)

gridDim グリッド内にあるブロックの数 

ブロック(Block)

blockIdx ブロックに割り当てられた番号  blockDim ブロック内にあるスレッドの数 

スレッド(Thread)

threadIdx スレッドに割り当てられた番号

(31)

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<<<?,?>>>(); cudaDeviceSynchronize(); return 0; } <<<>>>内の数字を変えると画面表示 される内容が変わる <<<>>>内の数字とどのパラメータが 対応しているかを確認 ・・・ hellothreads.cu

(32)

GPUの構造とカーネルの書き方

GPUはマルチスレッド

(メニースレッド)

で並列処理

 数百から数千のCUDAコアが搭載されており,それらが協調し て並列処理を実行  カーネルには1スレッドが実行する処理を書く  カーネルの作成を簡略化  カーネルを呼び出す際に並列処理の度合いを指定 

カーネルと引数の間に追加した<<<,>>>で並列処理の

度合を指定

(33)

各階層の値の設定

設定の条件

GPUの世代によって設定できる上限値が変化

確認の方法

pgaccelinfodeviceQueryGPU Computing SDKに含まれているサンプルCUDA Programming Guide  https://docs.nvidia.com/cuda/cuda‐c‐programming‐ guide/#compute‐capabilities

(34)

pgaccelinfoの実行結果

Device Number:       0 Device Name:       Tesla M2050 Device Revision Number:        2.0 Global Memory Size:      2817982464 Number of Multiprocessors:     14 Number of Cores:       448 Concurrent Copy and Execution: Yes Total Constant Memory:         65536 Total Shared Memory per Block: 49152 Registers per Block:       32768 Warp Size:       32 Maximum Threads per Block:     1024 Maximum Block Dimensions:      1024, 1024, 64 Maximum Grid Dimensions:       65535 x 65535 x 65535 Maximum Memory Pitch:      2147483647B Texture Alignment:       512B Clock Rate:      1147 MHz Initialization time:       4222411 microseconds Current free memory:       2746736640 Upload time (4MB):       2175 microseconds ( 829 ms pinned) Download time:       2062 microseconds ( 774 ms pinned) Upload bandwidth:      1928 MB/sec (5059 MB/sec pinned)

(35)

pgaccelinfo実行結果

Revision Number:       2.0Global Memory Size:      2817982464Warp Size:       32Maximum Threads per Block:     1024  Maximum Block Dimensions:      1024, 1024, 64  Maximum Grid Dimensions:       65535 x 65535 x 65535 GPUの世代 (どのような機能を有しているか) 実行時の パ ラ メ ー タ 選択の 際 に 重 要  各方向の最大値  1ブロックあたりのスレッド数は最大1024  (1024, 1, 1), (1, 1024, 1)

(36)

レポート課題

2(提出期限は2学期末)

hellothreads.cuを実行し,下記について考察せよ

<<<,>>>内の数字はどの情報を指定しているか  変数名(gridDim.x, etc.)とそれが表す情報の両方について考察  全スレッド数を216, 1ブロックあたりのスレッド数を26として実行 するには,<<<,>>>内にどのように記述すればよいか #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

(37)

レポートの書式

必ず表紙を付けること

 授業名,課題番号,学籍番号,氏名,提出日に加えて課題に 要した時間を書く 

課題内容,プログラム,実行結果,考察で構成

 プログラムを実行したtesla??およびGPUの番号も明記する こと 

pdf形式に変換してメールで提出

 宛先 degawa at vos.nagaokaut.ac.jp  メール題目 GPGPU実践基礎工学課題2(氏名)

参照

関連したドキュメント

First three eigenfaces : 3 個で 90 %ぐらいの 累積寄与率になる.

READ UNCOMMITTED 発生する 発生する 発生する 発生する 指定してもREAD COMMITEDで動作 READ COMMITTED 発生しない 発生する 発生する 発生する デフォルト.

図 キハダマグロのサプライ・チェーン:東インドネシアの漁村からアメリカ市場へ (資料)筆者調査にもとづき作成 The Yellowfin Tuna Supply Chain: From Fishing Villages in

(※)Microsoft Edge については、2020 年 1 月 15 日以降に Microsoft 社が提供しているメジャーバージョンが 79 以降の Microsoft Edge を対象としています。2020 年 1

[r]

&lt; &gt;内は、30cm角 角穴1ヶ所に必要量 セメント:2.5(5)&lt;9&gt;kg以上 砂 :4.5(9)&lt;16&gt;l以上 砂利 :6 (12)&lt;21&gt; l

・大都市に近接する立地特性から、高い県外就業者の割合。(県内2 県内2 県内2/ 県内2 / / /3、県外 3、県外 3、県外 3、県外1/3 1/3

ダウンロードしたファイルを 解凍して自動作成ツール (StartPro2018.exe) を起動します。.