SlideShare a Scribd company logo
1 of 19
Download to read offline
cl-cuda : a library to use NVIDIA CUDA in Common Lisp
2014.7.29 Masayuki Takagi
Lisp Meet Up presented by Shibuya.lisp #19
1.GPGPU
1.1.GPGPU(General Purpose GPU) とは?
1.2.GPU の歴史
1.3.スパコンへの浸透
3.cl-cuda ライブラリ
3.1.cl-cuda の特徴
3.2.使い方
3.3.内部設計
3.4.カーネル関数を起動するまでの流れ
3.5.デモ
3.6.パフォーマンス比較
3.7.レポジトリ
2.NVIDIA CUDA
2.1.CUDA とは?
2.2.プロセッサ・アーキテクチャ
2.3.メモリ・アーキテクチャ
2.4.プログラミング・モデル
目次:
1.GPGPU
© 2014 Masayuki Takagi-2-
1.1.GPGPU(General Purpose GPU) とは?
 GPU の計算資源を、画像処理以外の目的に応用する技術
© 2014 Masayuki Takagi-3-
1.2.GPUの歴史
3次元グラフィックスレンダリング
 仮想空間に配置したモデルから、画面のピクセルの色をそれぞれ計算
 VGA(640x480)の場合、独立した30万ピクセルの色を、60Hz(10-20msec)で処理する必要
 グラフィックアクセラレータ(GPU)の登場
GPGPU に至るまでのGPUの歴史的背景を、簡単になぞります。
固定パイプライン - 1990's
 物体表面での光や色の計算を、
ハードウェアで実装
 グローシェーディング、フォン
シェーディング
プログラマブル・シェーダ - 2000's
 物体表面での光や色の計算を、
ソフトウェア的にプログラム可能に
 バーテックスシェーダ、フラグメン
トシェーダ
General Purpose GPU - 2010's
 汎用的に使えるんじゃね??
© 2014 Masayuki Takagi-4-
1.3.スパコンへの浸透
GPGPU は、スパコン分野にも広く浸透しています。
TOP 500, June 2014, Poster
2.NVIDIA CUDA
© 2014 Masayuki Takagi-6-
2.1.CUDA とは?
 NVIDIA が提供する、並列計算アーキテクチャ。NVIDIA 製 GPU にて動作
 GPUを利用したコプロセッシングによって、データ並列の計算処理能力を大幅に向上
 C ベースの言語(CUDA C)、コンパイラ、デバッガ、プロファイラといった、ソフトウェア開
発環境も包括的に提供
Kepler GK110 のチップ写真
© 2014 Masayuki Takagi-7-
2.2.プロセッサ・アーキテクチャ
CUDAでは、大量のプロセッサ・コアを、以下のような階層構造をとることで管理しています。
 1つの GPU チップは、複数のストリーミング・マルチプロセッサ(SMX)からなる
 1つのストリーミング・マルチプロセッサは、192 個の CUDA コアと1組のフロー・コント
ローラ、 L1 キャッシュからなる
 複数のスレッドをまとめたスレッドブロックごとに、ストリーミング・マルチプロセッサで処
理する
GTX 680 ブロック図(一部省略)
© 2014 Masayuki Takagi-8-
2.3.メモリ・アーキテクチャ
CUDAにおけるメモリは、プロセッサ・コアの階層構造に対応して、以下のような階層構造をとってい
ます。
 レジスタは、1つの CUDA コアからのみアクセス可能
 シェアードメモリおよび L1 キャッシュは、同一の SMX に属する CUDA コア間で共有
 L2 キャッシュは、SMX 間で共有される。小容量だが、オンチップにあり高速
 グローバルメモリは、SMX 間で共有される。大容量だが、オフチップにあり低速
グローバルメモリ
L2 キャッシュ
シェアードメモリ / L1 キャッシュ
レジスタ
CUDA コア
ストリーミング・マルチプロセッサ(SMX)
GPU チップ
© 2014 Masayuki Takagi-9-
2.4.プログラミング・モデル
CUDA のプログラミング・モデルは、ハードウェアのアーキテクチャに対応した階層構造となっていま
す。
 C を拡張した CUDA C によって、カーネル関数を定義。CUDA スレッドを構成し、1つ
のCUDA コアで実行される。
 スレッド数の指定とともに、カーネル関数を起動。スレッドブロックを構成し、1つのスト
リーミング・マルチプロセッサ(SMX)で実行される。
 並列度が高く1つのスレッドブロックに収まらない場合、複数のスレッドブロックをまとめ
たグリッドを使い、複数の SMX で実行する。
3.cl-cuda ライブラリ
© 2014 Masayuki Takagi-11-
3.1.cl-cuda の特徴的な機能
cl-cuda は、Common Lisp から NVIDIA CUDA を使用するためのライブラリです。以下の機能を提
供します。
 カーネル関数の定義
 カーネル記述言語
 カーネルマクロの定義
 カーネルモジュールの遅延コンパイル及び遅延ロード
 CUDA コンテキストの管理
 ホストメモリ及びデバイスメモリの管理
 ホスト=デバイス間のメモリ転送
 OpenGL 相互運用
© 2014 Masayuki Takagi-12-
3.2.使い方(1)
ここでは、cl-cuda の使い方を簡単に示します。
 配列加算(vectorAdd)サンプル
 2つの配列の各要素を足し合わせ、3つ目の配列に格納
 各 CUDA コアが、配列の各要素を担当し、並列に処理
配列A
配列B
配列C
1 2 3
3 2 1
4 4 4+
© 2014 Masayuki Takagi-13-
3.2.使い方(2)
以下のようなコードで、Common Lisp から CUDA を使用できます。
(defkernel	
  vec-­‐add-­‐kernel	
  (void	
  ((a	
  float*)	
  (b	
  float*)	
  (c	
  float*)	
  (n	
  int)))
	
  	
  (let	
  ((i	
  (+	
  (*	
  block-­‐dim-­‐x	
  block-­‐idx-­‐x)	
  thread-­‐idx-­‐x)))
	
  	
  	
  	
  (if	
  (<	
  i	
  n)
	
  	
  	
  	
  	
  	
  	
  	
  (set	
  (aref	
  c	
  i)
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  (+	
  (aref	
  a	
  i)	
  (aref	
  b	
  i))))))
(defun	
  main	
  ()
	
  	
  (let*	
  ((dev-­‐id	
  0)
	
  	
  	
  	
  	
  	
  	
  	
  	
  (n	
  1024)
	
  	
  	
  	
  	
  	
  	
  	
  	
  (threads-­‐per-­‐block	
  256)
	
  	
  	
  	
  	
  	
  	
  	
  	
  (blocks-­‐per-­‐grid	
  (/	
  n	
  threads-­‐per-­‐block)))
	
  	
  	
  	
  (with-­‐cuda	
  (dev-­‐id)
	
  	
  	
  	
  	
  	
  (with-­‐memory-­‐blocks	
  ((a	
  'float	
  n)
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  (b	
  'float	
  n)
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  (c	
  'float	
  n))
	
  	
  	
  	
  	
  	
  	
  	
  (random-­‐init	
  a	
  n)
	
  	
  	
  	
  	
  	
  	
  	
  (random-­‐init	
  b	
  n)
	
  	
  	
  	
  	
  	
  	
  	
  (sync-­‐memory-­‐block	
  a	
  :host-­‐to-­‐device)
	
  	
  	
  	
  	
  	
  	
  	
  (sync-­‐memory-­‐block	
  b	
  :host-­‐to-­‐device)
	
  	
  	
  	
  	
  	
  	
  	
  (vec-­‐add-­‐kernel	
  a	
  b	
  c	
  n
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  :grid-­‐dim	
  	
  (list	
  blocks-­‐per-­‐grid	
  1	
  1)
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  :block-­‐dim	
  (list	
  threads-­‐per-­‐block	
  1	
  1))
	
  	
  	
  	
  	
  	
  	
  	
  (sync-­‐memory-­‐block	
  c	
  :device-­‐to-­‐host)
	
  	
  	
  	
  	
  	
  	
  	
  (verify-­‐result	
  a	
  b	
  c	
  n)))))
カーネル関数を定義
CUDA コンテキストを生成
ホストとデバイスに、メモリ領域を確保
ホストメモリからデバイスメモリへデータ
を転送
定義したカーネル関数を起動
デバイスメモリからホストメモリへデータ
を転送
© 2014 Masayuki Takagi-14-
3.3.内部設計
cl-cuda は、以下の3つのコンポーネントから構成されます。
cl-cuda.api
実際にユーザが利用するインターフェ
イスを提供。defkernel マクロ、カーネ
ルマネージャ、CUDA コンテキスト、メ
モリブロック、タイマ。
cl-cuda.lang
カーネル記述言語と、そのコンパイラ
を提供。コンパイラは、カーネル記述
言語を CUDA C へ変換する。CUDA
C から PTX ファイルへの変換は、cl-
cuda.api のカーネルマネージャが管
理する。
cl-cuda.driver-api
CUDA ドライバ API への FFI(Foreign
Function Interface)を提供。
© 2014 Masayuki Takagi-15-
3.4.カーネル関数を起動するまでの流れ
定義したカーネル関数を起動するまでの処理の流れは、以下のようになります。これらの処理は、
カーネルマネージャによって管理され、コンパイルやロードは、必要なタイミングまで遅延して実行さ
れます。
1. カーネル関数を定義
defkenrel マクロを使用して、カーネル関数を定義しま
す。
2. カーネル記述言語をコンパイル
cl-cuda.lang のコンパイラを用いて、カーネル記述言語
を CUDA C へコンパイルします。
3. CUDA C をコンパイル
NVIDIA の提供する NVCC (NVIDIA CUDA Compiler)
を呼び出し、CUDA C のコードをカーネルモジュール
(PTX ファイル)へコンパイルします。
4. カーネルモジュールをロード
CUDA ドライバ API を使用して、カーネルモジュールを
ロードします。
5. カーネル関数をロード
CUDA ドライバ API を使用して、起動したいカーネル
関数をロードします。
6. 引数として渡す値を配列に格納
引数として GPU に渡す値を格納した配列を用意しま
す。
7. カーネル関数を起動
CUDA ドライバ API を使用して、カーネル関数を起動
します。
© 2014 Masayuki Takagi-16-
3.5.デモ
Nbody シミュレーション
(:ql	
  :cl-­‐cuda-­‐interop-­‐examples)
(cl-­‐cuda-­‐interop-­‐examples.nbody:main	
  :gpu	
  t	
  :interop	
  t)
© 2014 Masayuki Takagi-17-
3.6.パフォーマンス比較
GPU を利用して並列計算することで、CPU での逐次処理に対し、40倍近い性能向上が得られまし
た。
x37.5
Amazon EC2 インスタンス
プロセッサ
コア数
g2.2xlarge g2.2xlarge
Xeon E5-2670 2.6GHz NVIDIA GRID K520
1 コア
(シングルスレッド、SIMD命令使用せず、gcc -O3相当)
1,536 コア
4.86[sec]
182.2[sec]
SPH(Smoothed Particle Hydrodynamics) による流体シミュレーション 11,774粒子
© 2014 Masayuki Takagi-18-
3.7.レポジトリ
cl-cuda は、GitHub から入手できます。Quicklispは、そのテストポリシーの都合上、登録不可でした。
https://github.com/takagi/cl-cuda/

More Related Content

What's hot

㉞cocos2d-xの開発環境をインストールしてみよう
㉞cocos2d-xの開発環境をインストールしてみよう㉞cocos2d-xの開発環境をインストールしてみよう
㉞cocos2d-xの開発環境をインストールしてみようNishida Kansuke
 
1072: アプリケーション開発を加速するCUDAライブラリ
1072: アプリケーション開発を加速するCUDAライブラリ1072: アプリケーション開発を加速するCUDAライブラリ
1072: アプリケーション開発を加速するCUDAライブラリNVIDIA Japan
 
もしCloudStackのKVMホストでPCIパススルーできるようになったら
もしCloudStackのKVMホストでPCIパススルーできるようになったらもしCloudStackのKVMホストでPCIパススルーできるようになったら
もしCloudStackのKVMホストでPCIパススルーできるようになったらTakuma Nakajima
 
プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜京大 マイコンクラブ
 
Linux KVM環境におけるGPGPU活用最新動向
Linux KVM環境におけるGPGPU活用最新動向Linux KVM環境におけるGPGPU活用最新動向
Linux KVM環境におけるGPGPU活用最新動向Taira Hajime
 
Fight Against Citadel in Japan by 中津留 勇
Fight Against Citadel in Japan by 中津留 勇Fight Against Citadel in Japan by 中津留 勇
Fight Against Citadel in Japan by 中津留 勇CODE BLUE
 
[Azure Antenna] クラウドで HPC ~ HPC on Azure ~
[Azure Antenna] クラウドで HPC ~ HPC on Azure ~[Azure Antenna] クラウドで HPC ~ HPC on Azure ~
[Azure Antenna] クラウドで HPC ~ HPC on Azure ~Shuichi Gojuki
 
[Cyber HPC Symposium 2019] Microsoft Azureによる、クラウド時代のハイパフォーマンスコンピューティング High...
[Cyber HPC Symposium 2019]  Microsoft Azureによる、クラウド時代のハイパフォーマンスコンピューティング High...[Cyber HPC Symposium 2019]  Microsoft Azureによる、クラウド時代のハイパフォーマンスコンピューティング High...
[Cyber HPC Symposium 2019] Microsoft Azureによる、クラウド時代のハイパフォーマンスコンピューティング High...Shuichi Gojuki
 
“bcache”を使ってSSDの速さと HDDの大容量のいいとこどり 2015-12-12
“bcache”を使ってSSDの速さと HDDの大容量のいいとこどり 2015-12-12“bcache”を使ってSSDの速さと HDDの大容量のいいとこどり 2015-12-12
“bcache”を使ってSSDの速さと HDDの大容量のいいとこどり 2015-12-12Nobuto Murata
 
DRBD/Heartbeat/Pacemakerで作るKVM仮想化クラスタ
DRBD/Heartbeat/Pacemakerで作るKVM仮想化クラスタDRBD/Heartbeat/Pacemakerで作るKVM仮想化クラスタ
DRBD/Heartbeat/Pacemakerで作るKVM仮想化クラスタ株式会社サードウェア
 
RHEL on Azure、初めの一歩
RHEL on Azure、初めの一歩RHEL on Azure、初めの一歩
RHEL on Azure、初めの一歩Ryo Fujita
 
[Azure Antenna] HPCだけじゃないDeep Learningでも使える ハイパフォーマンスAzureインフラ ~ Azureハイパフォーマ...
[Azure Antenna] HPCだけじゃないDeep Learningでも使える ハイパフォーマンスAzureインフラ ~ Azureハイパフォーマ...[Azure Antenna] HPCだけじゃないDeep Learningでも使える ハイパフォーマンスAzureインフラ ~ Azureハイパフォーマ...
[Azure Antenna] HPCだけじゃないDeep Learningでも使える ハイパフォーマンスAzureインフラ ~ Azureハイパフォーマ...Shuichi Gojuki
 
Ubuntuとコンテナ技術 What is LXD? and Why? 2015-12-08
Ubuntuとコンテナ技術 What is LXD? and Why? 2015-12-08Ubuntuとコンテナ技術 What is LXD? and Why? 2015-12-08
Ubuntuとコンテナ技術 What is LXD? and Why? 2015-12-08Nobuto Murata
 
PEZY-SC2上における倍々精度Rgemmの実装と評価
PEZY-SC2上における倍々精度Rgemmの実装と評価PEZY-SC2上における倍々精度Rgemmの実装と評価
PEZY-SC2上における倍々精度Rgemmの実装と評価Toshiaki Hishinuma
 
仮想記憶入門 BSD-4.3を例題に
仮想記憶入門 BSD-4.3を例題に仮想記憶入門 BSD-4.3を例題に
仮想記憶入門 BSD-4.3を例題にmagoroku Yamamoto
 
CMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティング
CMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティングCMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティング
CMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティングComputational Materials Science Initiative
 
20170726 py data.tokyo
20170726 py data.tokyo20170726 py data.tokyo
20170726 py data.tokyoManaMurakami1
 

What's hot (20)

㉞cocos2d-xの開発環境をインストールしてみよう
㉞cocos2d-xの開発環境をインストールしてみよう㉞cocos2d-xの開発環境をインストールしてみよう
㉞cocos2d-xの開発環境をインストールしてみよう
 
1072: アプリケーション開発を加速するCUDAライブラリ
1072: アプリケーション開発を加速するCUDAライブラリ1072: アプリケーション開発を加速するCUDAライブラリ
1072: アプリケーション開発を加速するCUDAライブラリ
 
もしCloudStackのKVMホストでPCIパススルーできるようになったら
もしCloudStackのKVMホストでPCIパススルーできるようになったらもしCloudStackのKVMホストでPCIパススルーできるようになったら
もしCloudStackのKVMホストでPCIパススルーできるようになったら
 
プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜
 
Linux KVM環境におけるGPGPU活用最新動向
Linux KVM環境におけるGPGPU活用最新動向Linux KVM環境におけるGPGPU活用最新動向
Linux KVM環境におけるGPGPU活用最新動向
 
V6read#4
V6read#4V6read#4
V6read#4
 
Fight Against Citadel in Japan by 中津留 勇
Fight Against Citadel in Japan by 中津留 勇Fight Against Citadel in Japan by 中津留 勇
Fight Against Citadel in Japan by 中津留 勇
 
[Azure Antenna] クラウドで HPC ~ HPC on Azure ~
[Azure Antenna] クラウドで HPC ~ HPC on Azure ~[Azure Antenna] クラウドで HPC ~ HPC on Azure ~
[Azure Antenna] クラウドで HPC ~ HPC on Azure ~
 
[Cyber HPC Symposium 2019] Microsoft Azureによる、クラウド時代のハイパフォーマンスコンピューティング High...
[Cyber HPC Symposium 2019]  Microsoft Azureによる、クラウド時代のハイパフォーマンスコンピューティング High...[Cyber HPC Symposium 2019]  Microsoft Azureによる、クラウド時代のハイパフォーマンスコンピューティング High...
[Cyber HPC Symposium 2019] Microsoft Azureによる、クラウド時代のハイパフォーマンスコンピューティング High...
 
KVM+cgroup
KVM+cgroupKVM+cgroup
KVM+cgroup
 
“bcache”を使ってSSDの速さと HDDの大容量のいいとこどり 2015-12-12
“bcache”を使ってSSDの速さと HDDの大容量のいいとこどり 2015-12-12“bcache”を使ってSSDの速さと HDDの大容量のいいとこどり 2015-12-12
“bcache”を使ってSSDの速さと HDDの大容量のいいとこどり 2015-12-12
 
DRBD/Heartbeat/Pacemakerで作るKVM仮想化クラスタ
DRBD/Heartbeat/Pacemakerで作るKVM仮想化クラスタDRBD/Heartbeat/Pacemakerで作るKVM仮想化クラスタ
DRBD/Heartbeat/Pacemakerで作るKVM仮想化クラスタ
 
RHEL on Azure、初めの一歩
RHEL on Azure、初めの一歩RHEL on Azure、初めの一歩
RHEL on Azure、初めの一歩
 
[Azure Antenna] HPCだけじゃないDeep Learningでも使える ハイパフォーマンスAzureインフラ ~ Azureハイパフォーマ...
[Azure Antenna] HPCだけじゃないDeep Learningでも使える ハイパフォーマンスAzureインフラ ~ Azureハイパフォーマ...[Azure Antenna] HPCだけじゃないDeep Learningでも使える ハイパフォーマンスAzureインフラ ~ Azureハイパフォーマ...
[Azure Antenna] HPCだけじゃないDeep Learningでも使える ハイパフォーマンスAzureインフラ ~ Azureハイパフォーマ...
 
Ubuntuとコンテナ技術 What is LXD? and Why? 2015-12-08
Ubuntuとコンテナ技術 What is LXD? and Why? 2015-12-08Ubuntuとコンテナ技術 What is LXD? and Why? 2015-12-08
Ubuntuとコンテナ技術 What is LXD? and Why? 2015-12-08
 
PEZY-SC2上における倍々精度Rgemmの実装と評価
PEZY-SC2上における倍々精度Rgemmの実装と評価PEZY-SC2上における倍々精度Rgemmの実装と評価
PEZY-SC2上における倍々精度Rgemmの実装と評価
 
仮想記憶入門 BSD-4.3を例題に
仮想記憶入門 BSD-4.3を例題に仮想記憶入門 BSD-4.3を例題に
仮想記憶入門 BSD-4.3を例題に
 
CMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティング
CMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティングCMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティング
CMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティング
 
20170726 py data.tokyo
20170726 py data.tokyo20170726 py data.tokyo
20170726 py data.tokyo
 
20150630_MySQL勉強会
20150630_MySQL勉強会20150630_MySQL勉強会
20150630_MySQL勉強会
 

Similar to Lisp Meet Up #19, cl-cuda: a library to use NVIDIA CUDA in Common Lisp

NVIDIA Japan Seminar 2012
NVIDIA Japan Seminar 2012NVIDIA Japan Seminar 2012
NVIDIA Japan Seminar 2012Takuro Iizuka
 
Maxwell と Java CUDAプログラミング
Maxwell と Java CUDAプログラミングMaxwell と Java CUDAプログラミング
Maxwell と Java CUDAプログラミングNVIDIA Japan
 
PyOpenCLによるGPGPU入門
PyOpenCLによるGPGPU入門PyOpenCLによるGPGPU入門
PyOpenCLによるGPGPU入門Yosuke Onoue
 
Apache cloudstack4.0インストール
Apache cloudstack4.0インストールApache cloudstack4.0インストール
Apache cloudstack4.0インストールYasuhiro Arai
 
Apache CloudStack 4.0 インストール(ver0.5)
Apache CloudStack 4.0 インストール(ver0.5)Apache CloudStack 4.0 インストール(ver0.5)
Apache CloudStack 4.0 インストール(ver0.5)Yasuhiro Arai
 
Altera SDK for OpenCL解体新書 : ホストとデバイスの関係
Altera SDK for OpenCL解体新書 : ホストとデバイスの関係Altera SDK for OpenCL解体新書 : ホストとデバイスの関係
Altera SDK for OpenCL解体新書 : ホストとデバイスの関係Mr. Vengineer
 
TripleOの光と闇
TripleOの光と闇TripleOの光と闇
TripleOの光と闇Manabu Ori
 
OSC 2011 Hokkaido 自宅SAN友の会(後半)
OSC 2011 Hokkaido 自宅SAN友の会(後半)OSC 2011 Hokkaido 自宅SAN友の会(後半)
OSC 2011 Hokkaido 自宅SAN友の会(後半)Satoshi Shimazaki
 
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 2021Preferred Networks
 
Hopper アーキテクチャで、変わること、変わらないこと
Hopper アーキテクチャで、変わること、変わらないことHopper アーキテクチャで、変わること、変わらないこと
Hopper アーキテクチャで、変わること、変わらないことNVIDIA Japan
 
CloudStackユーザ会 OSC.cloud
CloudStackユーザ会 OSC.cloudCloudStackユーザ会 OSC.cloud
CloudStackユーザ会 OSC.cloudsamemoon
 
20130803 OSC@Kyoto CloudStackユーザー会
20130803 OSC@Kyoto CloudStackユーザー会20130803 OSC@Kyoto CloudStackユーザー会
20130803 OSC@Kyoto CloudStackユーザー会samemoon
 
インフラ野郎 Azureチーム v18.11 at Tech Summit 2018
インフラ野郎 Azureチーム v18.11 at Tech Summit 2018インフラ野郎 Azureチーム v18.11 at Tech Summit 2018
インフラ野郎 Azureチーム v18.11 at Tech Summit 2018Toru Makabe
 
CUDAプログラミング入門
CUDAプログラミング入門CUDAプログラミング入門
CUDAプログラミング入門NVIDIA Japan
 
OpenStack Summit November 2014 Paris出張報告
OpenStack Summit November 2014 Paris出張報告OpenStack Summit November 2014 Paris出張報告
OpenStack Summit November 2014 Paris出張報告Mitsuhiro SHIGEMATSU
 
もっとわかる Microsoft Azure 最新技術アップデート編 - 20150123
もっとわかる Microsoft Azure最新技術アップデート編 - 20150123もっとわかる Microsoft Azure最新技術アップデート編 - 20150123
もっとわかる Microsoft Azure 最新技術アップデート編 - 20150123Kuninobu SaSaki
 
Hello, DirectCompute
Hello, DirectComputeHello, DirectCompute
Hello, DirectComputedasyprocta
 
JellyBeanのソースをとりあえず眺めてみた(手抜き)
JellyBeanのソースをとりあえず眺めてみた(手抜き)JellyBeanのソースをとりあえず眺めてみた(手抜き)
JellyBeanのソースをとりあえず眺めてみた(手抜き)l_b__
 

Similar to Lisp Meet Up #19, cl-cuda: a library to use NVIDIA CUDA in Common Lisp (20)

NVIDIA Japan Seminar 2012
NVIDIA Japan Seminar 2012NVIDIA Japan Seminar 2012
NVIDIA Japan Seminar 2012
 
Maxwell と Java CUDAプログラミング
Maxwell と Java CUDAプログラミングMaxwell と Java CUDAプログラミング
Maxwell と Java CUDAプログラミング
 
PyOpenCLによるGPGPU入門
PyOpenCLによるGPGPU入門PyOpenCLによるGPGPU入門
PyOpenCLによるGPGPU入門
 
Apache cloudstack4.0インストール
Apache cloudstack4.0インストールApache cloudstack4.0インストール
Apache cloudstack4.0インストール
 
Cuda
CudaCuda
Cuda
 
Apache CloudStack 4.0 インストール(ver0.5)
Apache CloudStack 4.0 インストール(ver0.5)Apache CloudStack 4.0 インストール(ver0.5)
Apache CloudStack 4.0 インストール(ver0.5)
 
Altera SDK for OpenCL解体新書 : ホストとデバイスの関係
Altera SDK for OpenCL解体新書 : ホストとデバイスの関係Altera SDK for OpenCL解体新書 : ホストとデバイスの関係
Altera SDK for OpenCL解体新書 : ホストとデバイスの関係
 
TripleOの光と闇
TripleOの光と闇TripleOの光と闇
TripleOの光と闇
 
OSC 2011 Hokkaido 自宅SAN友の会(後半)
OSC 2011 Hokkaido 自宅SAN友の会(後半)OSC 2011 Hokkaido 自宅SAN友の会(後半)
OSC 2011 Hokkaido 自宅SAN友の会(後半)
 
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
 
Hopper アーキテクチャで、変わること、変わらないこと
Hopper アーキテクチャで、変わること、変わらないことHopper アーキテクチャで、変わること、変わらないこと
Hopper アーキテクチャで、変わること、変わらないこと
 
CloudStackユーザ会 OSC.cloud
CloudStackユーザ会 OSC.cloudCloudStackユーザ会 OSC.cloud
CloudStackユーザ会 OSC.cloud
 
Cmc cmd slim
Cmc cmd slimCmc cmd slim
Cmc cmd slim
 
20130803 OSC@Kyoto CloudStackユーザー会
20130803 OSC@Kyoto CloudStackユーザー会20130803 OSC@Kyoto CloudStackユーザー会
20130803 OSC@Kyoto CloudStackユーザー会
 
インフラ野郎 Azureチーム v18.11 at Tech Summit 2018
インフラ野郎 Azureチーム v18.11 at Tech Summit 2018インフラ野郎 Azureチーム v18.11 at Tech Summit 2018
インフラ野郎 Azureチーム v18.11 at Tech Summit 2018
 
CUDAプログラミング入門
CUDAプログラミング入門CUDAプログラミング入門
CUDAプログラミング入門
 
OpenStack Summit November 2014 Paris出張報告
OpenStack Summit November 2014 Paris出張報告OpenStack Summit November 2014 Paris出張報告
OpenStack Summit November 2014 Paris出張報告
 
もっとわかる Microsoft Azure 最新技術アップデート編 - 20150123
もっとわかる Microsoft Azure最新技術アップデート編 - 20150123もっとわかる Microsoft Azure最新技術アップデート編 - 20150123
もっとわかる Microsoft Azure 最新技術アップデート編 - 20150123
 
Hello, DirectCompute
Hello, DirectComputeHello, DirectCompute
Hello, DirectCompute
 
JellyBeanのソースをとりあえず眺めてみた(手抜き)
JellyBeanのソースをとりあえず眺めてみた(手抜き)JellyBeanのソースをとりあえず眺めてみた(手抜き)
JellyBeanのソースをとりあえず眺めてみた(手抜き)
 

Lisp Meet Up #19, cl-cuda: a library to use NVIDIA CUDA in Common Lisp

  • 1. cl-cuda : a library to use NVIDIA CUDA in Common Lisp 2014.7.29 Masayuki Takagi Lisp Meet Up presented by Shibuya.lisp #19 1.GPGPU 1.1.GPGPU(General Purpose GPU) とは? 1.2.GPU の歴史 1.3.スパコンへの浸透 3.cl-cuda ライブラリ 3.1.cl-cuda の特徴 3.2.使い方 3.3.内部設計 3.4.カーネル関数を起動するまでの流れ 3.5.デモ 3.6.パフォーマンス比較 3.7.レポジトリ 2.NVIDIA CUDA 2.1.CUDA とは? 2.2.プロセッサ・アーキテクチャ 2.3.メモリ・アーキテクチャ 2.4.プログラミング・モデル 目次:
  • 3. © 2014 Masayuki Takagi-2- 1.1.GPGPU(General Purpose GPU) とは?  GPU の計算資源を、画像処理以外の目的に応用する技術
  • 4. © 2014 Masayuki Takagi-3- 1.2.GPUの歴史 3次元グラフィックスレンダリング  仮想空間に配置したモデルから、画面のピクセルの色をそれぞれ計算  VGA(640x480)の場合、独立した30万ピクセルの色を、60Hz(10-20msec)で処理する必要  グラフィックアクセラレータ(GPU)の登場 GPGPU に至るまでのGPUの歴史的背景を、簡単になぞります。 固定パイプライン - 1990's  物体表面での光や色の計算を、 ハードウェアで実装  グローシェーディング、フォン シェーディング プログラマブル・シェーダ - 2000's  物体表面での光や色の計算を、 ソフトウェア的にプログラム可能に  バーテックスシェーダ、フラグメン トシェーダ General Purpose GPU - 2010's  汎用的に使えるんじゃね??
  • 5. © 2014 Masayuki Takagi-4- 1.3.スパコンへの浸透 GPGPU は、スパコン分野にも広く浸透しています。 TOP 500, June 2014, Poster
  • 7. © 2014 Masayuki Takagi-6- 2.1.CUDA とは?  NVIDIA が提供する、並列計算アーキテクチャ。NVIDIA 製 GPU にて動作  GPUを利用したコプロセッシングによって、データ並列の計算処理能力を大幅に向上  C ベースの言語(CUDA C)、コンパイラ、デバッガ、プロファイラといった、ソフトウェア開 発環境も包括的に提供 Kepler GK110 のチップ写真
  • 8. © 2014 Masayuki Takagi-7- 2.2.プロセッサ・アーキテクチャ CUDAでは、大量のプロセッサ・コアを、以下のような階層構造をとることで管理しています。  1つの GPU チップは、複数のストリーミング・マルチプロセッサ(SMX)からなる  1つのストリーミング・マルチプロセッサは、192 個の CUDA コアと1組のフロー・コント ローラ、 L1 キャッシュからなる  複数のスレッドをまとめたスレッドブロックごとに、ストリーミング・マルチプロセッサで処 理する GTX 680 ブロック図(一部省略)
  • 9. © 2014 Masayuki Takagi-8- 2.3.メモリ・アーキテクチャ CUDAにおけるメモリは、プロセッサ・コアの階層構造に対応して、以下のような階層構造をとってい ます。  レジスタは、1つの CUDA コアからのみアクセス可能  シェアードメモリおよび L1 キャッシュは、同一の SMX に属する CUDA コア間で共有  L2 キャッシュは、SMX 間で共有される。小容量だが、オンチップにあり高速  グローバルメモリは、SMX 間で共有される。大容量だが、オフチップにあり低速 グローバルメモリ L2 キャッシュ シェアードメモリ / L1 キャッシュ レジスタ CUDA コア ストリーミング・マルチプロセッサ(SMX) GPU チップ
  • 10. © 2014 Masayuki Takagi-9- 2.4.プログラミング・モデル CUDA のプログラミング・モデルは、ハードウェアのアーキテクチャに対応した階層構造となっていま す。  C を拡張した CUDA C によって、カーネル関数を定義。CUDA スレッドを構成し、1つ のCUDA コアで実行される。  スレッド数の指定とともに、カーネル関数を起動。スレッドブロックを構成し、1つのスト リーミング・マルチプロセッサ(SMX)で実行される。  並列度が高く1つのスレッドブロックに収まらない場合、複数のスレッドブロックをまとめ たグリッドを使い、複数の SMX で実行する。
  • 12. © 2014 Masayuki Takagi-11- 3.1.cl-cuda の特徴的な機能 cl-cuda は、Common Lisp から NVIDIA CUDA を使用するためのライブラリです。以下の機能を提 供します。  カーネル関数の定義  カーネル記述言語  カーネルマクロの定義  カーネルモジュールの遅延コンパイル及び遅延ロード  CUDA コンテキストの管理  ホストメモリ及びデバイスメモリの管理  ホスト=デバイス間のメモリ転送  OpenGL 相互運用
  • 13. © 2014 Masayuki Takagi-12- 3.2.使い方(1) ここでは、cl-cuda の使い方を簡単に示します。  配列加算(vectorAdd)サンプル  2つの配列の各要素を足し合わせ、3つ目の配列に格納  各 CUDA コアが、配列の各要素を担当し、並列に処理 配列A 配列B 配列C 1 2 3 3 2 1 4 4 4+
  • 14. © 2014 Masayuki Takagi-13- 3.2.使い方(2) 以下のようなコードで、Common Lisp から CUDA を使用できます。 (defkernel  vec-­‐add-­‐kernel  (void  ((a  float*)  (b  float*)  (c  float*)  (n  int)))    (let  ((i  (+  (*  block-­‐dim-­‐x  block-­‐idx-­‐x)  thread-­‐idx-­‐x)))        (if  (<  i  n)                (set  (aref  c  i)                          (+  (aref  a  i)  (aref  b  i)))))) (defun  main  ()    (let*  ((dev-­‐id  0)                  (n  1024)                  (threads-­‐per-­‐block  256)                  (blocks-­‐per-­‐grid  (/  n  threads-­‐per-­‐block)))        (with-­‐cuda  (dev-­‐id)            (with-­‐memory-­‐blocks  ((a  'float  n)                                                      (b  'float  n)                                                      (c  'float  n))                (random-­‐init  a  n)                (random-­‐init  b  n)                (sync-­‐memory-­‐block  a  :host-­‐to-­‐device)                (sync-­‐memory-­‐block  b  :host-­‐to-­‐device)                (vec-­‐add-­‐kernel  a  b  c  n                                                :grid-­‐dim    (list  blocks-­‐per-­‐grid  1  1)                                                :block-­‐dim  (list  threads-­‐per-­‐block  1  1))                (sync-­‐memory-­‐block  c  :device-­‐to-­‐host)                (verify-­‐result  a  b  c  n))))) カーネル関数を定義 CUDA コンテキストを生成 ホストとデバイスに、メモリ領域を確保 ホストメモリからデバイスメモリへデータ を転送 定義したカーネル関数を起動 デバイスメモリからホストメモリへデータ を転送
  • 15. © 2014 Masayuki Takagi-14- 3.3.内部設計 cl-cuda は、以下の3つのコンポーネントから構成されます。 cl-cuda.api 実際にユーザが利用するインターフェ イスを提供。defkernel マクロ、カーネ ルマネージャ、CUDA コンテキスト、メ モリブロック、タイマ。 cl-cuda.lang カーネル記述言語と、そのコンパイラ を提供。コンパイラは、カーネル記述 言語を CUDA C へ変換する。CUDA C から PTX ファイルへの変換は、cl- cuda.api のカーネルマネージャが管 理する。 cl-cuda.driver-api CUDA ドライバ API への FFI(Foreign Function Interface)を提供。
  • 16. © 2014 Masayuki Takagi-15- 3.4.カーネル関数を起動するまでの流れ 定義したカーネル関数を起動するまでの処理の流れは、以下のようになります。これらの処理は、 カーネルマネージャによって管理され、コンパイルやロードは、必要なタイミングまで遅延して実行さ れます。 1. カーネル関数を定義 defkenrel マクロを使用して、カーネル関数を定義しま す。 2. カーネル記述言語をコンパイル cl-cuda.lang のコンパイラを用いて、カーネル記述言語 を CUDA C へコンパイルします。 3. CUDA C をコンパイル NVIDIA の提供する NVCC (NVIDIA CUDA Compiler) を呼び出し、CUDA C のコードをカーネルモジュール (PTX ファイル)へコンパイルします。 4. カーネルモジュールをロード CUDA ドライバ API を使用して、カーネルモジュールを ロードします。 5. カーネル関数をロード CUDA ドライバ API を使用して、起動したいカーネル 関数をロードします。 6. 引数として渡す値を配列に格納 引数として GPU に渡す値を格納した配列を用意しま す。 7. カーネル関数を起動 CUDA ドライバ API を使用して、カーネル関数を起動 します。
  • 17. © 2014 Masayuki Takagi-16- 3.5.デモ Nbody シミュレーション (:ql  :cl-­‐cuda-­‐interop-­‐examples) (cl-­‐cuda-­‐interop-­‐examples.nbody:main  :gpu  t  :interop  t)
  • 18. © 2014 Masayuki Takagi-17- 3.6.パフォーマンス比較 GPU を利用して並列計算することで、CPU での逐次処理に対し、40倍近い性能向上が得られまし た。 x37.5 Amazon EC2 インスタンス プロセッサ コア数 g2.2xlarge g2.2xlarge Xeon E5-2670 2.6GHz NVIDIA GRID K520 1 コア (シングルスレッド、SIMD命令使用せず、gcc -O3相当) 1,536 コア 4.86[sec] 182.2[sec] SPH(Smoothed Particle Hydrodynamics) による流体シミュレーション 11,774粒子
  • 19. © 2014 Masayuki Takagi-18- 3.7.レポジトリ cl-cuda は、GitHub から入手できます。Quicklispは、そのテストポリシーの都合上、登録不可でした。 https://github.com/takagi/cl-cuda/