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

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

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

NUMAの構成

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

Slide 1

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

Slide 1

( CUDA CUDA CUDA CUDA ( NVIDIA CUDA I

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

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

TSUBAMEのTeslaを用いたGPGPU(CUDAの基礎)

TSUBAMEのTeslaを用いたGPGPU(CUDAの基礎)

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

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

memo

memo

memo

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

CUDA 連携とライブラリの活用 2

TSUBAMEのTeslaを用いたGPGPU(CUDAの基礎)

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

Microsoft PowerPoint - kougi7.ppt

Microsoft PowerPoint - endo-jssst14.pptx

GPUコンピューティング講習会パート1

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

untitled

01-introduction.ppt

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

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

slide5.pptx

プログラミング実習I

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション - 物理学情報処理演習

GPU.....

< F2D837C E95CF CF68A4A94C5816A2E6A>

プログラミングI第10回

GPGPUクラスタの性能評価

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

02: 変数と標準入出力

本文ALL.indd

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

GPGPUイントロダクション

program7app.ppt

Taro-ファイル処理(公開版).jtd

コマンドラインから受け取った文字列の大文字と小文字を変換するプログラムを作成せよ 入力は 1 バイトの表示文字とし アルファベット文字以外は変換しない 1. #include <stdio.h> 2. #include <ctype.h> /*troupper,islower,isupper,tol

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

PowerPoint Presentation

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

PowerPoint プレゼンテーション

Microsoft Word - no202.docx

Prog1_10th

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

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

ポインタ変数

Microsoft PowerPoint ppt

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

EnSightのご紹介

Microsoft PowerPoint - lec10.ppt

画像ファイルを扱う これまでに学んだ条件分岐, 繰り返し, 配列, ファイル入出力を使って, 画像を扱うプログラムにチャレンジしてみよう

Microsoft PowerPoint - 11.pptx

関数の呼び出し ( 選択ソート ) 選択ソートのプログラム (findminvalue, findandreplace ができているとする ) #include <stdiu.h> #define InFile "data.txt" #define OutFile "surted.txt" #def

GPUコンピューティング講習会パート1

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

Microsoft PowerPoint pptx

Microsoft Word - Training10_プリプロセッサ.docx

第9回 配列(array)型の変数

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

次に示す数値の並びを昇順にソートするものとする このソートでは配列の末尾側から操作を行っていく まず 末尾の数値 9 と 8 に着目する 昇順にソートするので この値を交換すると以下の数値の並びになる 次に末尾側から 2 番目と 3 番目の 1

Prog1_6th

Microsoft Word - HOKUSAI_system_overview_ja.docx

/*Source.cpp*/ #include<stdio.h> //printf はここでインクルードして初めて使えるようになる // ここで関数 average を定義 3 つの整数の平均値を返す double 型の関数です double average(int a,int b,int c){

02: 変数と標準入出力

DO 時間積分 START 反変速度の計算 contravariant_velocity 移流項の計算 advection_adams_bashforth_2nd DO implicit loop( 陰解法 ) 速度勾配, 温度勾配の計算 gradient_cell_center_surface 速

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

gengo1-11

関数の呼び出し ( 選択ソート ) 選択ソートのプログラム (findminvalue, findandreplace ができているとする ) #include <stdio.h> #define InFile "data.txt" #define OutFile "sorted.txt" #def

演算増幅器

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

RICCについて

講習No.12

2006年10月5日(木)実施

cp-7. 配列

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

PowerPoint プレゼンテーション

Microsoft Word ●IntelクアッドコアCPUでのベンチマーク_吉岡_ _更新__ doc

DVIOUT

gengo1-12

! 行行 CPUDSP PPESPECell/B.E. CPUGPU 行行 SIMD [SSE, AltiVec] 用 HPC CPUDSP PPESPE (Cell/B.E.) SPE CPUGPU GPU CPU DSP DSP PPE SPE SPE CPU DSP SPE 2

02: 変数と標準入出力

ERDAS IMAGINE における処理速度の向上 株式会社ベストシステムズ PASCO CORPORATION 2015

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

目的と目次 OpenCL はこれからのマルチコアプログラミングの主流 ( かも ) GPU (NVIDIA, AMD/ATI) Cell B.E. 組み込みプロセッサ 共通コードとして OpenCL に対応するために必要な準備を考える 目次 基礎編 ( 今回 ) OpenCL とは 実践編 高速化の

VXPRO R1400® ご提案資料

Taro-最大値探索法の開発(公開版

Microsoft Word - no103.docx

講習No.9

02: 変数と標準入出力

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

kiso2-09.key

デバッグの工夫

Transcription:

GPU プログラミング 基礎編 東京工業大学学術国際情報センター

1. GPU コンピューティングと TSUBAME2.0 スーパーコンピュータ

GPU コンピューティングとは グラフィックプロセッサ (GPU) は グラフィック ゲームの画像計算のために 進化を続けてきた 現在 CPU のコア数は 2~12 個に対し GPU 中には数百コア その GPU を一般アプリケーションの高速化に利用! GPGPU (General-Purpose computing on GPU) とも言われる 2000 年代前半から研究としては存在 2007 年に NVIDIA 社の CUDA 言語がリリースされてから大きな注目 2010/12/06

TSUBAME2.0 スーパーコンピュータ Tokyo-Tech Supercomputer and UBiquitously Accessible Mass-storage Environment ツバメ は東京工業大学のシンボルマークでもある TSUBAME1: 2006 年 ~2010 年に稼働したスパコン TSUBAME2.0: 2010 年に作られたスパコン 2010 年には 世界 4 位 日本 1 位の計算速度性能 現在 世界 14 位 日本 3 位高性能の秘訣が GPU コンピューティング

TSUBAME2.0 スパコン GPU は様々な 気象シミュレーション 研究分野で利用されている 動脈血流シミュレーション 津波 防災シミュレーション 金属結晶凝固シミュレーション ウィルス分子シミュレーション グラフ構造解析

TSUBAME 2.0 全体概要

TSUBAME2.0 の計算ノード TSUBAME2.0 は 約 1400 台の計算ノード ( コンピュータ ) を持つ 各計算ノードは CPU と GPU の両方を持つ CPU: Intel Xeon 2.93GHz 6 コア x 2CPU=12 コア GPU: NVIDIA Tesla M2050 3GPU CPU 140GFlops + GPU 1545GFlops = 1685GFlops GFlops は計算速度の単位 9 割の性能が GPU のおかげ! メインメモリ (CPU 側メモリ ): 54GB SSD: 120GB ネットワーク : QDR InfiniBand x 2 = 80Gbps OS: SUSE Linux 11 (Linuxの一種)

GPU の特徴 (1) コンピュータにとりつける増設ボード 単体では動作できず CPU から指示を出してもらう 448 コアを用いて計算 多数のコアを活用するために 多数のスレッドが協力して計算 メモリサイズ 3GB ( 実際使えるのは約 2.5GB) CPU 側のメモリと別なので データの移動 もプログラミングする必要 上記のコア数 メモリサイズは M2050 GPU 1 つあたり 製品によっても違う

GPU の特徴 (2) M2050 GPU 1 つあたりの性能 計算速度 : 515 GFLOPS CPU は 20~100GFlops 程度 メモリバンド幅 : 約 150 GB/s CPU は 10~32GB/s 程度 その他の特徴 ハードウェアキャッシュ C++ サポート ECC 以前の GPU にはキャッシュメモリが無かったので 高速なプログラム作成がより大変だった

参考 : 2CPU と 3GPU を持つ TSUBAME2.0 計算ノードの構成 DDR3 memory メ 24GB モリ合計 DDR3 memory 54GB 30GB 32GB/s Xeon CPU 6core 70.4GFlops Xeon CPU 6core 70.4GFlops QPI 25.6GB/s IOH IOH QDR InfiniBand 4GB/s PCIe 2.0 x16 8GB/s GPU 0: Tesla M2050 448core 515GFlops GPU 1: Tesla M2050 448core 515GFlops GPU 2: Tesla M2050 448core 515GFlops 150GB/s GDDR5 memory 3GB 3GB 3GB

様々な GPU やアクセラレータ NVIDIA GPU GeForce シリーズ : 一般の PC に搭載されているタイプで 比較的安価 パソコンショップで売っている Tesla シリーズ : GPU コンピューティング専用ハードウェア TSUBAME2.0 に搭載されているのは Tesla M2050 AMD/ATI GPU 東芝 Sony IBM Cell プロセッサ プレイステーション 3 に搭載 Intel MIC アーキテクチャ

様々な GPU 向けプログラミング言語 CUDA ( 本講義でとりあげる ) NVIDIA GPU 向けのプログラミング言語 OpenCL NVIDIA GPU, AMD GPU, 普通の Intel マルチコア CPU でも動く ただし CUDA よりさらに複雑な傾向 OpenACC お手軽な GPU プログラミングのために最近提案された CPU 用プログラムに ヒント を追加

2. CUDA プログラムの流れ

プログラミング言語 CUDA NVIDIA GPU 向けのプログラミング言語 2007 年 2 月に最初のリリース TSUBAME2.0 で使えるのは V4.1 Linux, Windows, MacOS 対応 本講義では Linux 版 標準 C 言語サブセット +GPGPU 用拡張機能 C 言語の基本的な知識 ( 特にポインタ ) は必要となります nvcc コマンドを用いてコンパイル ソースコードの拡張子は.cu CUDA 関連書籍もあり 著者は東工大の先生

CUDA プログラムのコンパイルと実行例 サンプルプログラム inc_seq.cu を利用 以下のコマンドをターミナルから入力し CUDA プログラムのコンパイル 実行を確認してください $ はコマンドプロンプトです $ nvcc inc_seq.cu arch sm_21 o inc_seq $./inc_seq -arch sm_21 は 最新の CUDA 機能を使うためのオプション ( 普段つけておいてください )

サンプルプログラム : inc_seq.cu int 型配列の全要素を 1 加算 GPU であまり意味がない ( 速くない ) 例ですが #include <stdio.h> #include <stdlib.h> #include <cuda.h> #include <cuda_runtime.h> #define N (32) global void inc(int *array, int len) { int i; for (i = 0; i < len; i++) array[i]++; return; } int main(int argc, char *argv[]) { int i; int arrayh[n]; int *arrayd; size_t array_size; } for (i=0; i<n; i++) arrayh[i] = i; printf( input: ); for (i=0; i<n; i++) printf( %d, arrayh[i]); printf( n ); array_size = sizeof(int) * N; cudamalloc((void **)&arrayd, array_size); cudamemcpy(arrayd, arrayh, array_size, cudamemcpyhosttodevice); inc<<<1, 1>>>(arrayD, N); cudamemcpy(arrayh, arrayd, array_size, cudamemcpydevicetohost); printf( output: ); for (i=0; i<n; i++) printf( %d, arrayh[i]); printf( n ); return 0;

CUDA プログラム構成 ホストプログラム + GPU カーネル関数 ホストプログラム CPU 上で実行されるプログラム ほぼ通常の C 言語 main 関数から処理がはじまる GPU に対してデータ転送 GPU カーネル関数呼び出しを実行 GPU カーネル関数 GPU 上で実行される関数 ( サンプルでは inc 関数 ) ホストプログラムから呼び出されて実行 ( 単にカーネル関数と呼ぶ場合も )

典型的な制御とデータの流れ @ CPU @ GPU (1) GPU 側メモリにデータ用領域を確保 (2) 入力データを GPU へ転送 (3) GPU カーネル関数を呼び出し (5) 出力を CPU 側メモリへ転送 global void kernel_func() { (4) カーネル関数を実行 return; } 入力 入力 出力 出力 CPU 側メモリ ( メインメモリ ) GPU 側メモリ ( デバイスメモリ ) この2 種類のメモリの区別は常におさえておく

(1) @CPU: GPU 側メモリ領域確保 cudamalloc(void **devpp, size_t count) GPU 側メモリ ( デバイスメモリ グローバルメモリと呼ばれる ) に領域を確保 devpp: デバイスメモリアドレスへのポインタ 確保したメモリのアドレスが書き込まれる count: 領域のサイズ cudafree(void *devp) 指定領域を開放 例 : 長さ 1024 の int の配列を確保 #define N (1024) int *arrayd; cudamalloc((void **)&arrayd, sizeof(int) * N); // arrayd has the address of allocated device memory

(2) @CPU: 入力データ転送 cudamemcpy(void *dst, const void *src, size_t count, enum cudamemcpykind kind) 先に cudamalloc で確保した領域に指定した CPU 側メモリのデータをコピー dst: 転送先デバイスメモリ src: 転送元 CPU メモリ count: 転送サイズ ( バイト単位 ) kind: 転送タイプを指定する定数 ここでは cudamemcpyhosttodevice を与える 例 : 先に確保した領域へ CPU 上のデータ arrayh を転送 int arrayh[n]; cudamemcpy(arrayd, arrayh, sizeof(int)*n, cudamemcpyhosttodevice); 2010/12/06

(3) @CPU: GPU カーネルの呼び出し kernel_func<<<grid_dim, block_dim>>> (kernel_param1, ); kernel_func: カーネル関数名 kernel_param: カーネル関数の引数 例 : カーネル関数 inc を呼び出し 引数その 2 入力配列の長さ inc<<<1, 1>>>(arrayD, N); 2010/12/06 CUDA 特有な構文により スレッド数を記述する 詳しくは後で 引数その 1 入力配列へのポインタ

(4) @GPU: カーネル関数 GPU 上で実行される関数 global というキーワードをつける注 : global の前後にはアンダーバー 2 つずつ GPU 側メモリのみアクセス可 CPU 側メモリはアクセス不可 引数利用可能 値の返却は不可 (void のみ ) 例 : int 型配列をインクリメントするカーネル関数 2010/12/06 global void inc(int *array, int len) { int i; for (i = 0; i < len; i++) array[i]++; return; }

(5) @CPU: 結果の返却 入力転送と同様に cudamemcpy を用いる ただし 転送タイプは cudamemcpydevicetohost を指定 例 : 結果の配列を CPU 側メモリへ転送 cudamemcpy(arrayh, arrayd, sizeof(int)*n, cudamemcpydevicetohost); 2010/12/06

カーネル関数内でできること できないこと if, for, whileなどの制御構文はok GPU 側メモリのアクセスはok CPU 側メモリのアクセスは不可 inc_seqサンプルで arraydと間違ってarrayhをカーネル関数に渡してしまうとバグ!! ( 何が起こるか分からない ) ファイルアクセスなどは不可 printfは例外的にokなので デバグに役立つ 関数呼び出しは device つき関数 に対してならok @CPU @GPU CPU 側関数 global 関数 device 関数 上図の矢印の方向にのみ呼び出しできる GPU 内から CPU 関数は呼べない device つき関数は 返り値を返せるので便利

3. CUDA における並列化

CUDA における並列化 たくさんのスレッドが GPU 上で並列に動作することにより 初めて GPU を有効活用できる inc_seq プログラムは 1 スレッドしか使っていない データ並列性を基にした並列化が一般的 例 : 巨大な配列があるとき 各スレッドが一部づつを分担して処理 高速化が期待できる 一人の小人が大きな畑を耕す場合 複数の小人が分担して耕すと速く終わる

CUDA におけるスレッド (1) CUDA でのスレッドは階層構造になっている グリッドは 複数のスレッドブロックから成る スレッドブロックは 複数のスレッドから成る カーネル関数呼び出し時にスレッド数を二段階で指定 kernel_func<<<100, 30>>>(a, b, c); スレッドブロックの数 ( スレッドブロックあたりの ) スレッドの数 この例では 100x30=3000 個のスレッドが kernel_func を並列に実行する

Host Kernel 1 Kernel 2 Block (1, 1) (0, 0) (0, 1) (0, 2) Device (1, 0) (1, 1) (1, 2) Grid 1 Block (0, 0) Block (0, 1) Grid 2 CUDA でのスレッド (2) (2, 0) (2, 1) (2, 2) Block (1, 0) Block (1, 1) (3, 0) (3, 1) (3, 2) Source: NVIDIA (4, 0) (4, 1) (4, 2) Block (2, 0) Block (2, 1) スレッドブロック数およびスレッド数はそれぞれが int 型整数 三次元の dim3 型 (CUDA 特有 ) のどちらか 指定例 <<<100, 30>>> <<<dim3(100,20,5), dim3(4, 8, 4)>>> <<<4, dim3(20, 9)>>> なお dim3(100,1,1) と 100 は同じ意味となる

グリッドとスレッドブロック 1 次元 2 次元 3 次元でグリッドのサイズを指定可 各スレッドが 自分は誰か? を知るために 以下を利用可能 dim3 griddim グリッドサイズ dim3 blockidx グリッド内のブロックのインデックス つまり自分が何番目のブロックに属するか (0 からはじまる ) 1 次元目は griddim.x, blockidx.x として利用 blockidx 同様に 2 次元目は ~.y, 3 次元目は ~.z 最大サイズ (M2050 GPU では ) 65535 x 65535 x 65535 y Block (0, 0) Block (0, 1) Block (1, 0) Block (1, 1) Block (2, 0) Block (2, 1) griddim: dim3(3, 2) x

スレッドブロックとスレッド 1 次元 2 次元 3 次元でスレッドブロックのサイズを指定可 各スレッドが 自分は誰か? を知るために 以下を利用可能 dim3 blockdim スレッドブロックサイズ dim3 threadidx ブロック内のスレッドインデックス つまりブロック内で自分が何番目のスレッドか (0 からはじまる ) 最大サイズの制限有り M2050 GPU では x は 1024 まで y は 1024 まで z は 64 まで 全体で 1024 まで y blockdim: dim3(5, 3) (0, 0) (0, 1) (0, 2) (1, 0) (1, 1) (1, 2) (2, 0) (2, 1) (2, 2) threadidx (3, 0) (3, 1) (3, 2) x (4, 0) (4, 1) (4, 2)

サンプルプログラムの改良 inc_par は inc_seq と同じ計算を行うが N 要素の計算のために N スレッドを利用する点が違う #include <stdio.h> #include <stdlib.h> #include <cuda.h> #include <cuda_runtime.h> #define N (32) #define BS (8) global void inc(int *array, int len) { int i = blockidx.x * blockdim.x + threadidx.x; array[i]++; return; } int main(int argc, char *argv[]) { int i; int arrayh[n]; int *arrayd; size_t array_size; } for (i=0; i<n; i++) arrayh[i] = i; printf( input: ); for (i=0; i<n; i++) printf( %d, arrayh[i]); printf( n ); array_size = sizeof(int) * N; cudamalloc((void **)&arrayd, array_size); cudamemcpy(arrayd, arrayh, array_size, cudamemcpyhosttodevice); inc<<<n/bs, BS>>>(arrayD, N); cudamemcpy(arrayh, arrayd, array_size, cudamemcpydevicetohost); printf( output: ); for (i=0; i<n; i++) printf( %d, arrayh[i]); printf( n ); return 0;

inc_par プログラムのポイント (1) N 要素の計算のために N スレッドを利用 inc<<<n/bs, BS>>>(...); グリッドサイズ スレッドブロックサイズこの例では 前もって BS=8 とした ちなみに <<<N, 1>>> や <<<1, N>>> でも動くのだが非効率的である ちなみに このままでは N が BS で割り切れないときに正しく動かない どう改造すればよいか?

inc_par プログラムのポイント (2) inc_par の並列化の方針 ( 通算で )0 番目のスレッドに array[0] の計算をさせる 1 番目のスレッドに array[1] の計算 : N-1 番目のスレッドに array[n-1] の計算 配列 array 各スレッドは 自分は通算で何番目のスレッドか? を知るために 下記を計算 i = blockidx.x * blockdim.x + threadidx.x; 使いまわせる便利な式 1 スレッドは array[i] の 1 要素だけ計算 for ループは無し

変数 メモリに関するルール カーネル関数内で宣言される変数は 各スレッド独自の値を持つ あるスレッドでは i=0, 別のスレッドでは i=1 カーネル関数に与えられた引数は 全スレッド同じ値 inc_par プログラムでは array ポインタと len 全スレッドは GPU 側メモリを共有しており 読み書きできる ただし 複数スレッドが同じ場所に書き込むとぐちゃぐちゃ (race condition) になるので注意 同じ場所を読み込むのは ok

4. GPU の計算速度の威力

少し高度な例 : 行列積演算 (1) 行列積演算サンプルプログラムサイズ 1024x1024 の行列 A, B, C があるとき C=A B を計算するいくつかのバージョンを比較 : matmul_cpu.c CPU で計算 約 8.3 秒 (gcc O2 でコンパイルした場合 ) matmul_seq.cu GPU の 1 スレッドで計算 約 200 秒 CPU より遅くなってしまった matmul_par.cu GPU の複数スレッドで計算 約 0.027 秒 けた違いに速い!!

行列積演算 (2): cpu 版 /seq 版 行列 A 行列 B 行列 Cの要素 C i,j を求めるには Aの第 i 行全体 Bの第 j 列全体の内積計算を行う このためにforループ C 全体を計算するためには 三重の for ループ 行列 C

行列積演算 (3): par 版 matmul_par では 1024x1024 個のスレッドを用い 1 スレッドが C の 1 要素を計算 matmul<<<dim3(n / BS, L / BS), dim3(bs, BS)>>> (Ad, Bd, Cd, L, M, N); ここで L=M=N=1024 BS は前もって適当に決めた数 (16) カーネル関数は内積のための一重 for ループ グリッドサイズ ブロックサイズとも二次元で指定 ちなみに 更なる並列化のために C の 1 要素の計算を複数スレッドで行うのは容易ではない ( 合計の計算時にスレッド間の同期が必要 )

効率のよいプログラムのために グリッドサイズが 14 以上 かつスレッドブロックサイズが 32 以上の場合に効率的 M2050 GPU では GPU 中の SM 数 =14 SM 中の CUDA core 数 =32 なので ぎりぎりよりも 数倍以上にしたほうが効率的な場合が多い ( ベストな点はプログラム依存 ) ほかにも色々効率化のポイントあり 応用編で

基礎編のまとめ GPU プログラミングと TSUBAME2.0 スパコンについて説明した CUDA プログラミング言語の基礎について説明した CPU 側メモリ ( メインメモリ ) とGPU 側メモリ ( デバイスメモリ ) は異なるため cudamemcpyでデータをコピーする GPUカーネル関数を呼ぶ際には グリッドサイズとスレッドブロックサイズ ( その積がスレッド数 ) を指定