Slide 1

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

Slide 1

untitled

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

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

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

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

( CUDA CUDA CUDA CUDA ( NVIDIA CUDA I

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

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

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


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

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

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

! 行行 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

NUMAの構成

CUDA基礎1

AquesTalk プログラミングガイド

RICCについて

Microsoft PowerPoint _OpenCAE並列計算分科会.pptx

「RAD Studio XE5によるマルチ言語/マルチデバイス開発の進め方」

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


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

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

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

Microsoft PowerPoint - GPU_computing_2013_01.pptx

untitled

02: 変数と標準入出力

02: 変数と標準入出力

02: 変数と標準入出力

AquesTalk for WinCE プログラミングガイド

Insert your Title here

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

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

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

02: 変数と標準入出力

04-process_thread_2.ppt

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

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

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

AquesTalk Win Manual

GPU Computing on Business

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

PowerPoint Presentation

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

Microsoft Word - 2stellaris_ccs.doc

GPU CUDA CUDA 2010/06/28 1

日本アンドロイドの会 四国支部 Kickoff ミーティング in ABC2009

Microsoft PowerPoint - suda.pptx

02: 変数と標準入出力

GPGPUクラスタの性能評価

untitled

N08

CashDrawer ライブラリ API 仕様書 2014/07/09 CashDrawer ライブラリ API 仕様書 Rev / 10

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

IntroductionForGR-PEACH.pptx




概要 プログラミング論 変数のスコープ, 記憶クラス. メモリ動的確保. 変数のスコープ 重要. おそらく簡単. 記憶クラス 自動変数 (auto) と静的変数 (static). スコープほどではないが重要.

GPUを用いたN体計算

インテル(R) Visual Fortran コンパイラ 10.0

rank ”«‘‚“™z‡Ì GPU ‡É‡æ‡éŁÀŠñ›»

24th Embarcadero Developer Camp

GPGPUイントロダクション

AquesTalk2 Win マニュアル

GPGPU によるアクセラレーション環境について

POSIXスレッド

プログラミング実習I

DPC-0401

統合開発環境CubeSuite+ V へのバージョンアップのお知らせ

memo

7th CodeGear Developer Camp


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

7th CodeGear Developer Camp

CuPy とは何か?

CudaWaveField



好きですまえばし

1. USB の VCP( 仮想 COM ポート ) について USB の VCP( 仮想 COM ポート ) は USB を非同期シリアル通信として使用するための USB のドライバです PC には VCP ドライバをインストールする必要があります USB の VCP( 仮想 COM ポート )

INplc-Driver[INFnCtrl]ユーザーズガイド

昨年度までの研究紹介 および 研究計画

ユーザーマニュアル開発環境編

Microsoft PowerPoint _2.プログラミングの基礎_final.pptx

AN1609 GNUコンパイラ導入ガイド

Microsoft Word - nvsi_050090jp_oracle10g_vlm.doc

Application Note Application Note No. ESC-APN Document No.: ESC-APN adviceluna Linux デバッグ手順 (MIPS コア編 ) はじめに adviceluna Linux デバッグ手順 ( 以

Microsoft PowerPoint - 1_コンパイラ入門セミナー.ppt

Microsoft PowerPoint _2.プログラミングの基礎_final


TRQerS - Introduction

OS

1 OpenCL OpenCL 1 OpenCL GPU ( ) 1 OpenCL Compute Units Elements OpenCL OpenCL SPMD (Single-Program, Multiple-Data) SPMD OpenCL work-item work-group N

スライド 1

NetworkVantage 9

Transcription:

CUDA プログラミングの基本 パート I - ソフトウェアスタックとメモリ管理

CUDA の基本の概要 パート I CUDAのソフトウェアスタックとコンパイル GPUのメモリ管理 パートII カーネルの起動 GPUコードの具体項目 注 : 取り上げているのは基本事項のみです そのほか多数の API 関数についてはプログラミングガイドを ご覧ください

CUDA インストレーション CUDA インストレーションの構成 ドライバ CUDAツールキット ( コンパイラ ) CUDA SDK( サンプルコード ) 各種プラットフォームへのインストール方法についてはクイックスタートガイドを参照 http://www.nvidia.com/cuda

CUDA のソフトウェア開発 CUDA 最適化ライブラリ : math.h FFT BLAS... CPU+GPU 統合 C ソースコード NVIDIA C コンパイラ コンピューティング用 NVIDIA アセンブリ (PTX) CPU ホストコード CUDA ドライバ デバッガプロファイラ 標準 C コンパイラ GPU CPU

CUDA コードのコンパイル C/C++ CUDA Application NVCC CPU Code PTX Code PTX to Target Compiler 仮想 物理 G80 GPU ターゲットコード

ビルド構成 nvcc <filename>.cu [-o <executable>] リリースモード nvcc -g <filename>.cu デバッグモードホストコードのデバッグ用 デバイスコードのデバッグは不可 nvcc -deviceemu <filename>.cu デバイスエミュレーションモードすべてのコードをCPU 上で実行 デバッグシンボルなし nvcc -deviceemu -g <filename>.cu デバッグデバイスエミュレーションモードすべてのコードをCPU 上で実行 デバッグシンボルあり

メモリの管理 CPUとGPUが別々にメモリ空間を持つホスト (CPU) コードでデバイス (GPU) メモリを管理 : 領域確保 / 解放デバイスとの間のデータコピーグローバルデバイスメモリ (DRAM) が対象 DRAM CPU Chipset Device DRAM Local Memory Global Memory GPU Multiprocessor Multiprocessor Multiprocessor Registers Shared Memory

GPU メモリのアロケーション / 領域解放 cudamalloc(void ** pointer, size_t nbytes) cudamemset(void * pointer, int value, size_t count) cudafree(void* pointer) int n = 1024; int nbytes = 1024*sizeof(int); int *d_a = 0; cudamalloc( (void**)&d_a, nbytes ); cudamemset( d_a, 0, nbytes); cudafree(d_a);

データコピー cudamemcpy(void *dst, void *src, size_t nbytes, enum cudamemcpykind direction); direction で src と dst の場所 ( ホスト デバイス ) を指定 CPU スレッドをブロック : コピー完了後に戻る以前の CUDA コールが完了するまでコピーを開始しない enum cudamemcpykind cudamemcpytodevice cudamemcpydeviceto cudamemcpydevicetodevice

データ移動の例 Device

データ移動の例 int main(void) { float *a_h, *b_h; // host data float *a_d, *b_d; // device data int N = 14, nbytes, i ; nbytes = N*sizeof(float); a_h = (float *)malloc(nbytes); b_h = (float *)malloc(nbytes); cudamalloc((void **) &a_d, nbytes); cudamalloc((void **) &b_d, nbytes); a_h b_h for (i=0, i<n; i++) a_h[i] = 100.f + i; cudamemcpy(a_d, a_h, nbytes, cudamemcpytodevice); cudamemcpy(b_d, a_d, nbytes, cudamemcpydevicetodevice); cudamemcpy(b_h, b_d, nbytes, cudamemcpydeviceto); } for (i=0; i< N; i++) assert( a_h[i] == b_h[i] ); free(a_h); free(b_h); cudafree(a_d); cudafree(b_d); return 0;

データ移動の例 int main(void) { float *a_h, *b_h; // host data float *a_d, *b_d; // device data int N = 14, nbytes, i ; nbytes = N*sizeof(float); a_h = (float *)malloc(nbytes); b_h = (float *)malloc(nbytes); cudamalloc((void **) &a_d, nbytes); cudamalloc((void **) &b_d, nbytes); for (i=0, i<n; i++) a_h[i] = 100.f + i; a_h b_h Device a_d b_d cudamemcpy(a_d, a_h, nbytes, cudamemcpytodevice); cudamemcpy(b_d, a_d, nbytes, cudamemcpydevicetodevice); cudamemcpy(b_h, b_d, nbytes, cudamemcpydeviceto); } for (i=0; i< N; i++) assert( a_h[i] == b_h[i] ); free(a_h); free(b_h); cudafree(a_d); cudafree(b_d); return 0;

データ移動の例 int main(void) { float *a_h, *b_h; // host data float *a_d, *b_d; // device data int N = 14, nbytes, i ; nbytes = N*sizeof(float); a_h = (float *)malloc(nbytes); b_h = (float *)malloc(nbytes); cudamalloc((void **) &a_d, nbytes); cudamalloc((void **) &b_d, nbytes); for (i=0, i<n; i++) a_h[i] = 100.f + i; a_h b_h Device a_d b_d cudamemcpy(a_d, a_h, nbytes, cudamemcpytodevice); cudamemcpy(b_d, a_d, nbytes, cudamemcpydevicetodevice); cudamemcpy(b_h, b_d, nbytes, cudamemcpydeviceto); } for (i=0; i< N; i++) assert( a_h[i] == b_h[i] ); free(a_h); free(b_h); cudafree(a_d); cudafree(b_d); return 0;

データ移動の例 int main(void) { float *a_h, *b_h; // host data float *a_d, *b_d; // device data int N = 14, nbytes, i ; nbytes = N*sizeof(float); a_h = (float *)malloc(nbytes); b_h = (float *)malloc(nbytes); cudamalloc((void **) &a_d, nbytes); cudamalloc((void **) &b_d, nbytes); for (i=0, i<n; i++) a_h[i] = 100.f + i; a_h b_h Device a_d b_d cudamemcpy(a_d, a_h, nbytes, cudamemcpytodevice); cudamemcpy(b_d, a_d, nbytes, cudamemcpydevicetodevice); cudamemcpy(b_h, b_d, nbytes, cudamemcpydeviceto); } for (i=0; i< N; i++) assert( a_h[i] == b_h[i] ); free(a_h); free(b_h); cudafree(a_d); cudafree(b_d); return 0;

データ移動の例 int main(void) { float *a_h, *b_h; // host data float *a_d, *b_d; // device data int N = 14, nbytes, i ; nbytes = N*sizeof(float); a_h = (float *)malloc(nbytes); b_h = (float *)malloc(nbytes); cudamalloc((void **) &a_d, nbytes); cudamalloc((void **) &b_d, nbytes); for (i=0, i<n; i++) a_h[i] = 100.f + i; a_h b_h Device a_d b_d cudamemcpy(a_d, a_h, nbytes, cudamemcpytodevice); cudamemcpy(b_d, a_d, nbytes, cudamemcpydevicetodevice); cudamemcpy(b_h, b_d, nbytes, cudamemcpydeviceto); } for (i=0; i< N; i++) assert( a_h[i] == b_h[i] ); free(a_h); free(b_h); cudafree(a_d); cudafree(b_d); return 0;

データ移動の例 int main(void) { float *a_h, *b_h; // host data float *a_d, *b_d; // device data int N = 14, nbytes, i ; nbytes = N*sizeof(float); a_h = (float *)malloc(nbytes); b_h = (float *)malloc(nbytes); cudamalloc((void **) &a_d, nbytes); cudamalloc((void **) &b_d, nbytes); for (i=0, i<n; i++) a_h[i] = 100.f + i; a_h b_h Device a_d b_d cudamemcpy(a_d, a_h, nbytes, cudamemcpytodevice); cudamemcpy(b_d, a_d, nbytes, cudamemcpydevicetodevice); cudamemcpy(b_h, b_d, nbytes, cudamemcpydeviceto); } for (i=0; i< N; i++) assert( a_h[i] == b_h[i] ); free(a_h); free(b_h); cudafree(a_d); cudafree(b_d); return 0;

データ移動の例 int main(void) { float *a_h, *b_h; // host data float *a_d, *b_d; // device data int N = 14, nbytes, i ; nbytes = N*sizeof(float); a_h = (float *)malloc(nbytes); b_h = (float *)malloc(nbytes); cudamalloc((void **) &a_d, nbytes); cudamalloc((void **) &b_d, nbytes); for (i=0, i<n; i++) a_h[i] = 100.f + i; a_h b_h Device a_d b_d cudamemcpy(a_d, a_h, nbytes, cudamemcpytodevice); cudamemcpy(b_d, a_d, nbytes, cudamemcpydevicetodevice); cudamemcpy(b_h, b_d, nbytes, cudamemcpydeviceto); } for (i=0; i< N; i++) assert( a_h[i] == b_h[i] ); free(a_h); free(b_h); cudafree(a_d); cudafree(b_d); return 0;

データ移動の例 int main(void) { float *a_h, *b_h; // host data float *a_d, *b_d; // device data int N = 14, nbytes, i ; Device nbytes = N*sizeof(float); a_h = (float *)malloc(nbytes); b_h = (float *)malloc(nbytes); cudamalloc((void **) &a_d, nbytes); cudamalloc((void **) &b_d, nbytes); for (i=0, i<n; i++) a_h[i] = 100.f + i; cudamemcpy(a_d, a_h, nbytes, cudamemcpytodevice); cudamemcpy(b_d, a_d, nbytes, cudamemcpydevicetodevice); cudamemcpy(b_h, b_d, nbytes, cudamemcpydeviceto); } for (i=0; i< N; i++) assert( a_h[i] == b_h[i] ); free(a_h); free(b_h); cudafree(a_d); cudafree(b_d); return 0;

CUDA プログラミングの基本 パート I - ソフトウェアスタックとメモリ管理