SlideShare ist ein Scribd-Unternehmen logo
1 von 24
Downloaden Sie, um offline zu lesen
Altera SDK for OpenCL解体新書
ホストとデバイスの関係
2016.06.12(金)
@Vengineer
ホストとデバイスの関係(PCIeデバイス)
PCIeデバイスの場合は、下記のような構成になる
CPU
ホスト側の
メモリ
デバイス側の
メモリ
Kernel−A
Kernel−B
Kernel−C
DMA
PCIe PCIe
DMA
Altera SDK for OpenCLでのBSPとは?
CPU
ホスト側の
メモリ
Kernel−A
Kernel−B
Kernel−C
DMA
PCIe PCIe
DMABSPに相当する部分
デバイス側の
メモリ
MIF
生成されるHDLコード
CPU
ホスト側の
メモリ
デバイス側の
メモリ
Kernel−A
Kernel−B
Kernel−C
DMA
PCIe PCIe
DMAaocが生成するHDLコード
MIF
例題:vector addition
https://www.olcf.ornl.gov/tutorials/opencl-vector-addition/
double a[N], b[N], c[N];
vector_add( a, b, c, N );
void vector_add( double* a, double* b, double* c,
const unsigned int n )
{
for( unsigned int i=0 ; i<n ; i++ )
c[i] = a[i] + b[i];
}
デバイス側のOpenCLコード
const char *kernelSource =
#pragma OPENCL EXTENSION cl_khr_fp64 : enable
_kernel void vecAdd(__global double *a, __global double *b,
             __global double *c, const unsigned int n)
{
//Get our global thread ID
int id = get_global_id(0);
//Make sure we do not go out of bounds
if (id < n)
c[id] = a[id] + b[id];
}
ホスト側のCコード(メモリの割当)
h_a = (double*)malloc(bytes);
h_b = (double*)malloc(bytes);
h_c = (double*)malloc(bytes);
d_a = clCreateBuffer(context, CL_MEM_READ_ONLY , bytes, NULL, NULL);
d_b = clCreateBuffer(context, CL_MEM_READ_ONLY , bytes, NULL, NULL);
d_c = clCreateBuffer(context, CL_MEM_WRITE_ONLY , bytes, NULL, NULL);
ホスト側のCコード(実行部)
err = clEnqueueWriteBuffer(queue, d_a, CL_TRUE, 0, bytes, h_a, 0, NULL,
NULL);
err |= clEnqueueWriteBuffer(queue, d_b, CL_TRUE, 0, bytes, h_b, 0, NULL,
NULL);
err = clSetKernelArg(kernel, 0, sizeof(cl_mem), &d_a);
err |= clSetKernelArg(kernel, 1, sizeof(cl_mem), &d_b);
err |= clSetKernelArg(kernel, 2, sizeof(cl_mem), &d_c);
err |= clSetKernelArg(kernel, 3, sizeof(unsigned int), &n);
err = clEnqueueNDRangeKernel(queue, kernel, 1, NULL, &globalSize,
&localSize,
0, NULL,
NULL);
clFinish(queue);
ホスト側のCコード(メモリの開放)
clReleaseMemObject(d_a);
clReleaseMemObject(d_b);
clReleaseMemObject(d_c);
free(h_a);
free(h_b);
free(h_c);
処理フロー
1) ホスト側のメモリからデバイス側のメモリにデータを移動
clEnqueueWriteBuffer
2) カーネルへのパラメータ設定
  clSetKernelArg
3) カーネルを実行
clEnqueueTask / clEnqueuNDRangeKernel
4) カーネルの終了待ち
clFinish
5) デバイス側のメモリからホスト側のメモリにデータを移動
  clEnqueueReadBuffer
clEnqueuWriteBuffer
ホスト側のメモリからデバイス側のメモリへデータを移動する
CPU
ホスト側の
メモリ
デバイス側の
メモリ
Kernel−B
DMA
PCIe PCIe
DMA
clSetKernelArg
カーネルへのパラメータ設定
CPU
ホスト側の
メモリ
デバイス側の
メモリ
Kernel−B
DMA
PCIe PCIe
DMA
clEnqueuTask / clEnqueueNDRageKernel
カーネルの実行
CPU
ホスト側の
メモリ
デバイス側の
メモリ
Kernel−B
DMA
PCIe PCIe
DMA
clFinish
カーネルの終了待ち
CPU
ホスト側の
メモリ
デバイス側の
メモリ
Kernel−B
DMA
PCIe PCIe
DMA
clEnqueuReadBuffer
デバイス側のメモリからホスト側のメモリへデータを移動する
CPU
ホスト側の
メモリ
デバイス側の
メモリ
Kernel−B
DMA
PCIe PCIe
DMA
実行時間
CPUの実行時間に比べて、FPGAの実行時間が短くならないと
FPGAでのアクセレーションは意味が無い!
FPGAの実行時間 = 1) + 2) + 3) + 4) + 5)
 1) ホスト側のメモリからデバイス側のメモリにデータを移動
 2) カーネルへのパラメータ設定
 3) カーネルを実行
 4) カーネルの終了待ち
 5) デバイス側のメモリからホスト側のメモリにデータを移動
ホストとデバイスの関係(SoCデバイス)
SoCデバイスの場合は、下記のような構成になる
CPU
ホスト側の
メモリ
Kernel−A
Kernel−B
Kernel−C
PCIeデバイスでは必要だった、
データ移動のためのDMAがない
ホスト側のCコード(メモリの割当)
cl_mem d_a = clCreateBuffer(context,CL_MEM_ALLOC_HOST_PTR, bytes, NULL, NULL);
cl_mem d_b = clCreateBuffer(context,CL_MEM_ALLOC_HOST_PTR, bytes, NULL, NULL);
cl_mem d_c = clCreateBuffer(context,CL_MEM_ALLOC_HOST_PTR, bytes, NULL, NULL);
// clEnqueuWriteBuffer/clEnqueueReadBufferの代わりに
clEnqueueMapBufferが必要(ホスト側のメモリをマップする)
double *h_a = (double*)clEnqueueMapBuffer (queue, d_a, CL_TRUE, CL_MAP_READ,
0, bytes, 0, NULL, NULL );
double *h_b = (double*)clEnqueueMapBuffer (queue, d_b, CL_TRUE, CL_MAP_READ,
0, bytes, 0, NULL, NULL );
double *h_c = (double*)clEnqueueMapBuffer (queue, d_c, CL_TRUE, CL_MAP_WRITE,
0, bytes, 0, NULL, NULL );
ホスト側のCコード(実行部)
err = clSetKernelArg(kernel, 0, sizeof(cl_mem), &d_a);
err |= clSetKernelArg(kernel, 1, sizeof(cl_mem), &d_b);
err |= clSetKernelArg(kernel, 2, sizeof(cl_mem), &d_c);
err |= clSetKernelArg(kernel, 3, sizeof(unsigned int), &n);
err = clEnqueueNDRangeKernel(queue, kernel, 1, NULL, &globalSize,
&localSize,
0, NULL,
NULL);
clFinish(queue);
ホスト側のCコード(メモリの開放)
// clEnqueueUnMapMemObjectが必要
clEnqueueUnmapMemObject(queue, d_a, h_a, 0, NULL, NULL );
clEnqueueUnmapMemObject(queue, d_b, h_b, 0, NULL, NULL );
clEnqueueUnmapMemObject(queue, d_c, h_c, 0, NULL, NULL );
clReleaseMemObject(d_a);
clReleaseMemObject(d_b);
clReleaseMemObject(d_c);
// ホスト側のメモリ開放は必要なし
メモリ割当の違い
PCIeデバイス
 ホスト側のメモリ割当
 デバイス側のメモリ割当
  ....
 デバイス側のメモリ開放
 ホスト側のメモリ開放
SoCデバイス
 デバイス側のメモリ割当
 ホスト側のメモリマッピング
  ....
 ホスト側のメモリアンマッピング
 デバイス側のメモリ開放
SoCデバイスでは、CMAを使う
CPU
ホスト側の
メモリ
Kernel−A
Kernel−B
Kernel−C
ホスト側のメモリの一部を
デバイス側のメモリとして使用し、
CPU側からアクセスできるようにマップする
Linuxをブートするときに、
引数として、cma=128M のようにして
事前に割り当てる
CMA(Continuous Memory Allocator)
ただし、CPUからは非キャッシュ領域
参考資料)、https://aelseb.wordpress.com/2015/04/11/contiguous-memory-on-arm-and-cache-
coherency/
実行時間
CPUの実行時間に比べて、FPGAの実行時間が短くならないと
FPGAでのアクセレーションは意味が無い!
FPGAの実行時間 = 1) + 2) + 3) + 4) + 5)
 1) CPUがCMA領域(非キャッシュ領域)のメモリにデータを書き込む
 2) カーネルへのパラメータ設定
 3) カーネルを実行
 4) カーネルの終了待ち
 5) CPUがCMA領域(非キャッシュ領域)のメモリからデータを読み込む
おしまい

Weitere ähnliche Inhalte

Andere mochten auch

Andere mochten auch (8)

Altera SDK for OpenCL解体新書 perlスクリプト編
Altera SDK for OpenCL解体新書 perlスクリプト編Altera SDK for OpenCL解体新書 perlスクリプト編
Altera SDK for OpenCL解体新書 perlスクリプト編
 
SDSoC解体新書2016.2版ソフトウェア編 (チラ見) : Inside SDSoC v2016.2 (Software short edtion)
SDSoC解体新書2016.2版ソフトウェア編 (チラ見) : Inside SDSoC v2016.2 (Software short edtion)SDSoC解体新書2016.2版ソフトウェア編 (チラ見) : Inside SDSoC v2016.2 (Software short edtion)
SDSoC解体新書2016.2版ソフトウェア編 (チラ見) : Inside SDSoC v2016.2 (Software short edtion)
 
Intel Nervana Graph とは?
Intel Nervana Graph とは?Intel Nervana Graph とは?
Intel Nervana Graph とは?
 
プロファイラGuiを用いたコード分析 20160610
プロファイラGuiを用いたコード分析 20160610プロファイラGuiを用いたコード分析 20160610
プロファイラGuiを用いたコード分析 20160610
 
FPGAアクセラレータの作り方
FPGAアクセラレータの作り方FPGAアクセラレータの作り方
FPGAアクセラレータの作り方
 
Altera sdk for open cl アンケート集計結果(公開版)
Altera sdk for open cl アンケート集計結果(公開版)Altera sdk for open cl アンケート集計結果(公開版)
Altera sdk for open cl アンケート集計結果(公開版)
 
電波望遠鏡用の分光器をAltera SDK for OpenCL使ってサクッと作ってみた
電波望遠鏡用の分光器をAltera SDK for OpenCL使ってサクッと作ってみた電波望遠鏡用の分光器をAltera SDK for OpenCL使ってサクッと作ってみた
電波望遠鏡用の分光器をAltera SDK for OpenCL使ってサクッと作ってみた
 
TensorFlow XLA とハードウェア
TensorFlow XLA とハードウェアTensorFlow XLA とハードウェア
TensorFlow XLA とハードウェア
 

Ähnlich wie Altera SDK for OpenCL解体新書 : ホストとデバイスの関係

PyOpenCLによるGPGPU入門
PyOpenCLによるGPGPU入門PyOpenCLによるGPGPU入門
PyOpenCLによるGPGPU入門
Yosuke Onoue
 
C base design methodology with s dx and xilinx ml
C base design methodology with s dx and xilinx ml C base design methodology with s dx and xilinx ml
C base design methodology with s dx and xilinx ml
ssuser3a4b8c
 
Linux Kernel Seminar in tripodworks
Linux Kernel Seminar in tripodworksLinux Kernel Seminar in tripodworks
Linux Kernel Seminar in tripodworks
tripodworks
 
OpenStackクラウド基盤構築ハンズオンセミナー 第1日:ハンズオンNo1
OpenStackクラウド基盤構築ハンズオンセミナー 第1日:ハンズオンNo1OpenStackクラウド基盤構築ハンズオンセミナー 第1日:ハンズオンNo1
OpenStackクラウド基盤構築ハンズオンセミナー 第1日:ハンズオンNo1
Etsuji Nakai
 
NVIDIA Japan Seminar 2012
NVIDIA Japan Seminar 2012NVIDIA Japan Seminar 2012
NVIDIA Japan Seminar 2012
Takuro Iizuka
 
Dbts2012 unconference wttrw_yazekatsu_publish
Dbts2012 unconference wttrw_yazekatsu_publishDbts2012 unconference wttrw_yazekatsu_publish
Dbts2012 unconference wttrw_yazekatsu_publish
Yohei Azekatsu
 
Kai = (Dynamo + memcache API) / Erlang
Kai = (Dynamo + memcache API) / ErlangKai = (Dynamo + memcache API) / Erlang
Kai = (Dynamo + memcache API) / Erlang
Takeru INOUE
 

Ähnlich wie Altera SDK for OpenCL解体新書 : ホストとデバイスの関係 (20)

PyOpenCLによるGPGPU入門
PyOpenCLによるGPGPU入門PyOpenCLによるGPGPU入門
PyOpenCLによるGPGPU入門
 
C base design methodology with s dx and xilinx ml
C base design methodology with s dx and xilinx ml C base design methodology with s dx and xilinx ml
C base design methodology with s dx and xilinx ml
 
PEZY-SC programming overview
PEZY-SC programming overviewPEZY-SC programming overview
PEZY-SC programming overview
 
Lisp Meet Up #19, cl-cuda: a library to use NVIDIA CUDA in Common Lisp
Lisp Meet Up #19, cl-cuda: a library to use NVIDIA CUDA in Common LispLisp Meet Up #19, cl-cuda: a library to use NVIDIA CUDA in Common Lisp
Lisp Meet Up #19, cl-cuda: a library to use NVIDIA CUDA in Common Lisp
 
C#, C/CLI と CUDAによる画像処理ことはじめ
C#, C/CLI と CUDAによる画像処理ことはじめC#, C/CLI と CUDAによる画像処理ことはじめ
C#, C/CLI と CUDAによる画像処理ことはじめ
 
Linux Kernel Seminar in tripodworks
Linux Kernel Seminar in tripodworksLinux Kernel Seminar in tripodworks
Linux Kernel Seminar in tripodworks
 
OpenStackクラウド基盤構築ハンズオンセミナー 第1日:ハンズオンNo1
OpenStackクラウド基盤構築ハンズオンセミナー 第1日:ハンズオンNo1OpenStackクラウド基盤構築ハンズオンセミナー 第1日:ハンズオンNo1
OpenStackクラウド基盤構築ハンズオンセミナー 第1日:ハンズオンNo1
 
NVIDIA Japan Seminar 2012
NVIDIA Japan Seminar 2012NVIDIA Japan Seminar 2012
NVIDIA Japan Seminar 2012
 
TripleOの光と闇
TripleOの光と闇TripleOの光と闇
TripleOの光と闇
 
コンテナ型仮想化とはなんだったのか
コンテナ型仮想化とはなんだったのかコンテナ型仮想化とはなんだったのか
コンテナ型仮想化とはなんだったのか
 
仮想マシンにおけるメモリ管理
仮想マシンにおけるメモリ管理仮想マシンにおけるメモリ管理
仮想マシンにおけるメモリ管理
 
Dbts2012 unconference wttrw_yazekatsu_publish
Dbts2012 unconference wttrw_yazekatsu_publishDbts2012 unconference wttrw_yazekatsu_publish
Dbts2012 unconference wttrw_yazekatsu_publish
 
Kai = (Dynamo + memcache API) / Erlang
Kai = (Dynamo + memcache API) / ErlangKai = (Dynamo + memcache API) / Erlang
Kai = (Dynamo + memcache API) / Erlang
 
PEZY-SC2上における倍々精度Rgemmの実装と評価
PEZY-SC2上における倍々精度Rgemmの実装と評価PEZY-SC2上における倍々精度Rgemmの実装と評価
PEZY-SC2上における倍々精度Rgemmの実装と評価
 
Cuda
CudaCuda
Cuda
 
C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。
C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。
C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。
 
あるmmapの話
あるmmapの話あるmmapの話
あるmmapの話
 
PFNのML/DL基盤を支えるKubernetesにおける自動化 / DevOpsDays Tokyo 2021
PFNのML/DL基盤を支えるKubernetesにおける自動化 / DevOpsDays Tokyo 2021PFNのML/DL基盤を支えるKubernetesにおける自動化 / DevOpsDays Tokyo 2021
PFNのML/DL基盤を支えるKubernetesにおける自動化 / DevOpsDays Tokyo 2021
 
DartVM on Android
DartVM on AndroidDartVM on Android
DartVM on Android
 
2011.09.18 v7から始めるunix まとめ
2011.09.18 v7から始めるunix まとめ2011.09.18 v7から始めるunix まとめ
2011.09.18 v7から始めるunix まとめ
 

Mehr von Mr. Vengineer

Mehr von Mr. Vengineer (20)

XilinxのxsimでSoftware Driven Verification.pdf
XilinxのxsimでSoftware  Driven Verification.pdfXilinxのxsimでSoftware  Driven Verification.pdf
XilinxのxsimでSoftware Driven Verification.pdf
 
VerilatorとSystemCでSoftware Driven Verification
VerilatorとSystemCでSoftware Driven VerificationVerilatorとSystemCでSoftware Driven Verification
VerilatorとSystemCでSoftware Driven Verification
 
VerilatorとSystemC
VerilatorとSystemCVerilatorとSystemC
VerilatorとSystemC
 
TVM VTA (TSIM)
TVM VTA (TSIM) TVM VTA (TSIM)
TVM VTA (TSIM)
 
Cloud TPU Driver API ソースコード解析
Cloud TPU Driver API ソースコード解析Cloud TPU Driver API ソースコード解析
Cloud TPU Driver API ソースコード解析
 
Cloud Deep Learning Chips Training & Inference
Cloud Deep Learning Chips Training & InferenceCloud Deep Learning Chips Training & Inference
Cloud Deep Learning Chips Training & Inference
 
TensorFlow Lite Delegateとは?
TensorFlow Lite Delegateとは?TensorFlow Lite Delegateとは?
TensorFlow Lite Delegateとは?
 
Pixel Visual Core device driver source code analysis
Pixel Visual Core device driver source code analysisPixel Visual Core device driver source code analysis
Pixel Visual Core device driver source code analysis
 
Google Edge TPUで TensorFlow Liteを使った時に 何をやっているのかを妄想してみる 2 「エッジAIモダン計測制御の世界」オ...
Google Edge TPUで TensorFlow Liteを使った時に 何をやっているのかを妄想してみる 2  「エッジAIモダン計測制御の世界」オ...Google Edge TPUで TensorFlow Liteを使った時に 何をやっているのかを妄想してみる 2  「エッジAIモダン計測制御の世界」オ...
Google Edge TPUで TensorFlow Liteを使った時に 何をやっているのかを妄想してみる 2 「エッジAIモダン計測制御の世界」オ...
 
TensorFlow XLA 「XLAとは、から、最近の利用事例について」
TensorFlow XLA 「XLAとは、から、最近の利用事例について」TensorFlow XLA 「XLAとは、から、最近の利用事例について」
TensorFlow XLA 「XLAとは、から、最近の利用事例について」
 
Facebook Glow Compiler のソースコードをグダグダ語る会
Facebook Glow Compiler のソースコードをグダグダ語る会Facebook Glow Compiler のソースコードをグダグダ語る会
Facebook Glow Compiler のソースコードをグダグダ語る会
 
Ultra96(UltraZed)実践勉強会
Ultra96(UltraZed)実践勉強会Ultra96(UltraZed)実践勉強会
Ultra96(UltraZed)実践勉強会
 
Bridge TensorFlow to run on Intel nGraph backends (v0.4)
Bridge TensorFlow to run on Intel nGraph backends (v0.4)Bridge TensorFlow to run on Intel nGraph backends (v0.4)
Bridge TensorFlow to run on Intel nGraph backends (v0.4)
 
Bridge TensorFlow to run on Intel nGraph backends (v0.5)
Bridge TensorFlow to run on Intel nGraph backends (v0.5)Bridge TensorFlow to run on Intel nGraph backends (v0.5)
Bridge TensorFlow to run on Intel nGraph backends (v0.5)
 
TensorFlow XLA RPC
TensorFlow XLA RPCTensorFlow XLA RPC
TensorFlow XLA RPC
 
TensorFlow local Python XLA client
TensorFlow local Python XLA clientTensorFlow local Python XLA client
TensorFlow local Python XLA client
 
Tiramisu をちょっと、味見してみました。
Tiramisu をちょっと、味見してみました。Tiramisu をちょっと、味見してみました。
Tiramisu をちょっと、味見してみました。
 
LeFlowを調べてみました
LeFlowを調べてみましたLeFlowを調べてみました
LeFlowを調べてみました
 
Tensorflow dynamically loadable XLA plugin ソースコード解析
Tensorflow  dynamically loadable XLA plugin ソースコード解析Tensorflow  dynamically loadable XLA plugin ソースコード解析
Tensorflow dynamically loadable XLA plugin ソースコード解析
 
Tiramisu概要
Tiramisu概要Tiramisu概要
Tiramisu概要
 

Altera SDK for OpenCL解体新書 : ホストとデバイスの関係