SlideShare a Scribd company logo
1 of 53
Download to read offline
GPUが拓く地理情報分析の新たな地平
~GPU版PostGISの実装と検証~
HeteroDB,Inc
Chief Architect & CEO
海外 浩平 <kaigai@heterodb.com>
自己紹介/HeteroDB社について
PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平2
会社概要
 商号 ヘテロDB株式会社
 創業 2017年7月4日
 拠点 品川区北品川5-5-15
大崎ブライトコア4F
 事業内容 高速データベース製品の販売
GPU&DB領域の技術コンサルティング
ヘテロジニアスコンピューティング技術を
データベース領域に適用し、
誰もが使いやすく、安価で高速なデータ解析基盤を提供する。
代表者プロフィール
 海外 浩平(KaiGai Kohei)
 OSS開発者コミュニティにおいて、PostgreSQLやLinux kernelの
開発に10年以上従事。主にセキュリティ・FDW等の分野でアッ
プストリームへの貢献。
 IPA未踏ソフト事業において“天才プログラマー”認定 (2006)
 GPU Technology Conference Japan 2017でInception Awardを受賞
PG-Stromとは?
PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平3
【機能】
 集計/解析ワークロードの透過的なGPU高速化
 SSD-to-GPU Direct SQLによるPCIeバスレベルの最適化
 Apache Arrow対応によるデータ交換、インポート時間をほぼゼロに
 GPUメモリにデータを常駐。OLTPワークロードとの共存
 PostGIS関数のサポート(一部)。位置情報分析を高速化
PG-Strom: GPUとNVME/PMEMの能力を最大限に引き出し、
テラバイト級のデータを高速処理するPostgreSQL向け拡張モジュール
App
GPU
off-loading
for IoT/Big-Data
for ML/Analytics
➢ SSD-to-GPU Direct SQL
➢ Columnar Store (Arrow_Fdw)
➢ GPU Memory Store (Gstore_Fdw)
➢ Asymmetric Partition-wise
JOIN/GROUP BY
➢ BRIN-Index Support
➢ NVME-over-Fabric Support
➢ Inter-process Data Frame
for Python scripts
➢ Procedural Language for
GPU native code (w/ cuPy)
➢ PostGIS Support
NEW
NEW
GPUとはどんなプロセッサなのか?
PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平4
主にHPC分野で実績があり、機械学習用途で爆発的に普及
NVIDIA A100
スーパーコンピュータ
(東京工業大学 TSUBAME3.0) CG(Computer Graphics) 機械学習
数千コアの並列処理ユニット、TB/sに達する広帯域メモリを
ワンチップに実装した半導体デバイス
➔ “同じ計算を大量のデータに並列実行” を最も得意とする
シミュレーション
ターゲット:移動体デバイスのデータ検索
▌移動体デバイス
 高頻度で位置(緯度、経度)の更新がかかる。
 (デバイスID、タイムスタンプ、位置、その他の属性)というデータ構造が多い
▌エリア定義情報
 比較的件数は少なく、ほぼ静的なデータだが、エリア定義情報(多角形)が
非常に複雑な構造を持ち、当たり判定が“重い”
▌用途
 商圏分析、物流分析、広告配信、アラート通知、etc…
位置情報
(緯度、経度)
エリア定義情報
(ポリゴン)
移動体デバイス
エリア内に存在する
移動体デバイスの抽出
PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平5
GPU版PostGISについて
PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平6
PostGISって?(1/2)
▌概要
 点(Point)、線(LineString)、多角形(Polygon)等のジオメトリ要素、
およびそれらの間の演算を PostgreSQL で実行するための拡張モジュール
 演算の例 … 包含(Contains)、交差(Crosses)、接合(Touch)など
 GiSTインデックスに対応して高速な検索を実現
 2005年に PostGIS 1.0 がリリース。以降、15年にわたって継続的開発。
▌PostGIS関数・演算子の例
 st_distance(geometry g1, geometry g2)
✓ ジオメトリ間の距離を計算する
 st_contains(geometry g1, geometry g2)
✓ ジオメトリ g2 が g1 に包含されていれば真
 st_crosses(geometry g1, geometry g2)
✓ ジオメトリ g2 が g1 を横切っていれば真
…など
© GAIA RESOURCES
PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平7
PostGISって?(2/2)
PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平8
St_Distance(a,b)
ジオメトリ間の距離
St_Crosses(a,b)
ジオメトリの交差判定
St_Contains(a,b)
ジオメトリの包含判定
高速化手法(1/2)- Bounding Box
PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平9
▌Bounding Boxとは
 複雑な形状のポリゴンを包摂する最も小さな矩形領域
 (x1,y1) - (x2,y2) で表現できるのでデータ量が少ない
 PostgreSQL / PostGISが geometry 型を保存する時に自動的に生成される。
▌Bounding Boxの効果
 空間関係演算を行う前に、『明らかに接していない』ものを識別できる。
➔ 重なりを含むジオメトリのみ判定を行う事で、計算リソースを節約。
明らかに接していない
共通部分を持つ可能性
高速化手法(2/2)- GiSTインデックス
PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平10
▌GiSTインデックスとは
 PostgreSQLのGiST(Generalized Search Tree)は、ツリー構造を持つ
インデックスを一般化したフレームワーク。
 PostGISのGeometry型は、GiST上にR木を実装している。
▌GiSTのR木でできること
 包含(@演算子)や重なり(&&演算子)判定で、インデックスを用いた絞込み
 特に多数のポリゴン×ポイントの重なり判定で計算量が増大しやすい
➔ 事前の絞り込みで計算量を抑え込む
# 国土地理院の市町村形状データをインポート
$ shp2pgsql N03-20_200101.shp | psql gistest
gistest=# ¥d+
List of relations
Schema | Name | Type | Owner | Size |
--------+-------------+----------+--------+------------+
public | geo_japan | table | kaigai | 243 MB |
gistest=# ¥di+
List of relations
Schema | Name | Type | Owner | Table | Size |
--------+--------------------+-------+--------+-----------+---------+
public | geo_japan_pkey | index | kaigai | geo_japan | 2616 kB |
public | geo_japan_geom_idx | index | kaigai | geo_japan | 14 MB |
なぜGPUでSQLを高速化できるのか?
PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平11
▌GPUの特徴
 数千演算コアを搭載する計算能力
 1.0TB/sに迫るメモリバンド
➔ 「同じ演算を多量のデータに対して実行する」ために作られたプロセッサ
(e.g 行列演算)
▌SQLワークロードの特性
 「同じ処理を大量の行に対して実行する」
(例:WHERE句の評価、JOINやGROUP BY処理)
SQL処理の中でも、全件スキャンを伴うようなワークロードに強い
GPUに実装された数千コアの
実行ユニットが、個々の行を
並列に評価する。
GPUでPostGIS関数を実行する(1/2)
postgres=# ¥d _gistest
Table "public._gistest"
Column | Type | Collation | Nullable | Default
--------+----------+-----------+----------+--------------------------------------
id | integer | | not null | nextval('_gistest_id_seq'::regclass)
a | geometry | | |
b | geometry | | |
postgres=# explain verbose select * from _gistest where st_contains(a,b);
QUERY PLAN
------------------------------------------------------------------------------------
Custom Scan (GpuScan) on public._gistest (cost=4251.50..4251.50 rows=1 width=196)
Output: id, a, b
GPU Filter: st_contains(_gistest.a, _gistest.b)
GPU Preference: None
Kernel Source: /var/lib/pgdata/pgsql_tmp/pgsql_tmp_strom_21028.4.gpu
Kernel Binary: /var/lib/pgdata/pgsql_tmp/pgsql_tmp_strom_21028.5.ptx
(6 rows)
PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平12
GPUでPostGIS関数を実行する(2/2)
$ less /var/lib/pgdata/pgsql_tmp/pgsql_tmp_strom_21028.4.gpu
:
#include "cuda_postgis.h"
#include "cuda_gpuscan.h"
DEVICE_FUNCTION(cl_bool)
gpuscan_quals_eval(kern_context *kcxt,
kern_data_store *kds,
ItemPointerData *t_self,
HeapTupleHeaderData *htup)
{
void *addr __attribute__((unused));
pg_geometry_t KVAR_2;
pg_geometry_t KVAR_3;
assert(htup != NULL);
EXTRACT_HEAP_TUPLE_BEGIN(addr, kds, htup);
EXTRACT_HEAP_TUPLE_NEXT(addr);
pg_datum_ref(kcxt,KVAR_2,addr); // pg_geometry_t
EXTRACT_HEAP_TUPLE_NEXT(addr);
pg_datum_ref(kcxt,KVAR_3,addr); // pg_geometry_t
EXTRACT_HEAP_TUPLE_END();
return EVAL(pgfn_st_contains(kcxt, KVAR_2, KVAR_3));
}
:
PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平13
列A、列Bから
ジオメトリ型の
データをロード
ロードしたデータで
GPU版 st_contains() 関数を
呼出し
SQLのWHERE句を
評価するために
自動生成された関数
検索処理のパフォーマンス(1/2)
--- GpuScan (GPU版PostGIS) + Gstore_Fdw
=# SELECT count(*) FROM ft
WHERE st_contains('polygon ((10 10,90 10,90 12,12 12,12 88,90 88,90 90,¥
10 90,10 10))’, st_makepoint(x,y));
count
-------
94440
(1 row)
Time: 75.466 ms
--- 通常版PostGIS + PostgreSQLテーブル
=# SET pg_strom.enabled = off;
SET
=# SELECT count(*) FROM tt
WHERE st_contains('polygon ((10 10,90 10,90 12,12 12,12 88,90 88,90 90,¥
10 90,10 10))', st_makepoint(x,y));
count
-------
94440
(1 row)
Time: 332.300 ms
200万個のPointから、
指定領域内の数をカウント
PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平14
検索処理のパフォーマンス(2/2)
PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平15
(100,100)
(0,0)
(90,90)
(90,10)
(90,12)(12,12)
(12,88) (90,88)
(10,90)
(10,10)
この領域内に含まれる
点(Point)を抽出した
テーブル ft および tt には
(0,0)~(100,100)の範囲内に
ランダムに 200万個の点を格納
ポリゴン × 座標の突合
▌ナイーブなポリゴン×座標の突合を行おうとすると、
数万×数千万 = 数兆通りの組合せ、で計算量が爆発。
➔ GPUが数千コアを搭載していても、
計算量が多すぎて焼け石に水。
位置情報
(緯度、経度)
エリア定義情報
(ポリゴン)
移動体デバイス
数百万~数千万件数百~数万件
焼け石(GPU)に ➔
水冷モジュール
PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平16
GPUでGiSTインデックス
PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平17
GiSTインデックス(R木)の仕組み
▌GiSTインデックス(R木)の仕組み
✓ R1は(R3,R4,R5)を全て包含する矩形領域の(Xmin,Ymin) – (Xmax,Ymax)と、下位ノードへのポインタ
✓ R4は(R11,R12)を全て包含する矩形領域の(Xmin,Ymin) – (Xmax,Ymax)と、下位ノードへのポインタ
✓ R12は対象ジオメトリを包含する矩形領域の(Xmin,Ymin) – (Xmax,Ymax)と ItemPointer を含む。
✓ 各ノード(BLCKSZ)内のエントリを順に評価。マッチしたものを次の階層へすすめる。
✓ 階層ごとに繰り返し評価が発生するので、B-tree並みに速くはできない。
(xmin,ymin)
(xmax,ymax)
PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平18
検索キー(経度, 緯度)
〇 〇
GiSTインデックス(R木)の仕組み
▌GiSTインデックス(R木)の仕組み
✓ R1は(R3,R4,R5)を全て包含する矩形領域の(Xmin,Ymin) – (Xmax,Ymax)と、下位ノードへのポインタ
✓ R4は(R11,R12)を全て包含する矩形領域の(Xmin,Ymin) – (Xmax,Ymax)と、下位ノードへのポインタ
✓ R12は対象ジオメトリを包含する矩形領域の(Xmin,Ymin) – (Xmax,Ymax)と ItemPointer を含む。
✓ 各ノード(BLCKSZ)内のエントリを順に評価。マッチしたものを次の階層へすすめる。
✓ 階層ごとに繰り返し評価が発生するので、B-tree並みに速くはできない。
(xmin,ymin)
(xmax,ymax)
PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平19
検索キー(経度, 緯度)
〇 〇
× 〇 ×
GiSTインデックス(R木)の仕組み
▌GiSTインデックス(R木)の仕組み
✓ R1は(R3,R4,R5)を全て包含する矩形領域の(Xmin,Ymin) – (Xmax,Ymax)と、下位ノードへのポインタ
✓ R4は(R11,R12)を全て包含する矩形領域の(Xmin,Ymin) – (Xmax,Ymax)と、下位ノードへのポインタ
✓ R12は対象ジオメトリを包含する矩形領域の(Xmin,Ymin) – (Xmax,Ymax)と ItemPointer を含む。
✓ 各ノード(BLCKSZ)内のエントリを順に評価。マッチしたものを次の階層へすすめる。
✓ 階層ごとに繰り返し評価が発生するので、B-tree並みに速くはできない。
(xmin,ymin)
(xmax,ymax)
PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平20
検索キー(経度, 緯度)
〇 〇
× 〇 ×
〇×
GiSTインデックス(R木)の仕組み
▌GiSTインデックス(R木)の仕組み
✓ R1は(R3,R4,R5)を全て包含する矩形領域の(Xmin,Ymin) – (Xmax,Ymax)と、下位ノードへのポインタ
✓ R4は(R11,R12)を全て包含する矩形領域の(Xmin,Ymin) – (Xmax,Ymax)と、下位ノードへのポインタ
✓ R12は対象ジオメトリを包含する矩形領域の(Xmin,Ymin) – (Xmax,Ymax)と ItemPointer を含む。
✓ 各ノード(BLCKSZ)内のエントリを順に評価。マッチしたものを次の階層へすすめる。
✓ 階層ごとに繰り返し評価が発生するので、B-tree並みに速くはできない。
(xmin,ymin)
(xmax,ymax)
PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平21
検索キー(経度, 緯度)
〇 〇
× 〇 ×
〇×
× ×
GPU版GiSTインデックス
PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平22
▌仕組み
 多角形(エリア定義情報)を保持するテーブルと、位置情報(緯度経度)を
保持するテーブルとの JOIN にGiSTインデックスを使用できる。
 JOIN処理時、テーブルとインデックスの双方をGPUにロード。
先ずGiSTインデックス上のBounding-Box(矩形領域)を使って荒く絞り込み、
次にテーブル上の多角形(ポリゴン)と「当たり判定」を行う。
 GPUの数千コアをフル稼働してGiSTインデックスを探索する。
単純に並列度が高い分、検索速度も速くなるはず。
➔ が、そうは問屋が卸さなかった。。。
多角形 × 点の重なり判定などを、GpuJoinの一要素として実装
GiST(R木)インデックス
ポリゴン定義
位置データを含む
テーブル
数千スレッドが
並列に
インデックスを
探索
簡易テスト:ランダムな点とSt_Contains(9月末ごろ)
PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平23
(123.0, 20.0)
(154.2, 46.2)
SELECT n03_001,n03_004,count(*)
FROM geo_japan j, geopoint p
WHERE st_contains(j.geom, st_makepoint(x,y))
AND j.n03_001 like '東京都’
GROUP BY n03_001,n03_004;
ランダムに
生成した座標
1000万個
n03_001 | n03_004 | count
---------+------------+-------
東京都 | あきる野市 | 105
東京都 | 三宅村 | 76
東京都 | 三鷹市 | 17
東京都 | 世田谷区 | 67
東京都 | 中央区 | 12
東京都 | 中野区 | 18
東京都 | 八丈町 | 105
: : :
東京都 | 豊島区 | 14
東京都 | 足立区 | 55
東京都 | 青ヶ島村 | 7
東京都 | 青梅市 | 117
(63 rows)
CPU版:24.892s
GPU版:33.841s(遅い!)
国土地理院からDLした
全国市町村形状データ
前提)GPUスレッドのスケジューリングについて
PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平24
 GPUはStreaming Multiprocessor(SM)と呼ばれる単位でコアがグループ化されている。
✓ レジスタやL1キャッシュ(共有メモリ)はSM単位のリソース
 同じSM上で実行されるスレッドの組を Thread Group と呼び、リソースが許せば
最大で 1024 スレッドまで並行で実行する事ができる。
✓ スレッドの切り替えはH/W的に実現され、例えばDRAMアクセス待ちのタイミングで切り替わったり。
 スレッドはWarp (32threads) 単位でスケジューリングされる。同一Warp内のス
レッドは、同時には同じ命令しか実行できない。
✓ 行列計算のように、各コアの負荷が均等になるタイプの処理であればGPUの使用効率は最大化。
✓ スレッド毎に処理時間がバラバラだと、一部のコアが遊んでしまい、処理効率の低下を招く。
GPU Block Diagram
(Tesla V100; 80SMs)
Streaming Multiprocessors
(64CURE cores/SM)
●●●…●●●
●●●…●●●
●●●…●●●
●●●…●●●
●●●…●●●
●●●…●●●
Thread Group
(1~1024 Threads)
Warp (32 threads)
前提)GpuJoinの並列処理デザイン
PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平25
SELECT * FROM A, B
WHERE A.id = B.id;
Table-A
512スレッドが
512行を一度に
取り出し
Table-B
● ● ● ● ● ●
〇 × 〇 × 〇 ×
GpuHashJoin / GpuNestLoop 処理
N = __syncthreads_count(...)
JOIN結果の書き出し
atomic演算を用いて、thread_id=0が
結果バッファにN個分の領域を確保
次のフレームを
取り出して、
以降繰り返し
GpuHashJoin処理
• Hash値の計算
• Hash表の探索
• JOIN条件の評価
GpuNestLoop処理
• JOIN条件の評価
➔スレッド間で大きな
処理時間の差が
つきにくい。
参照
GPUでのインデックス探索の課題
PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平26
スレッド間の処理時間の差が大きく、同期待ちを招く
Table-A
● ● ● ● ● ●
参照
Index-A
× × × ×
×
〇
N = __syncthreads_count(...)
参照
R木のLeafノード
まで探索したが
ヒットせず
R木のRootノードを
見ただけで、即、
マッチする要素なし
R木を最後まで
探索し、かつ、
JOINの結合条件を評価
スレッドグループに属する
他のスレッドの完了待ちで
GPUコアが遊んでしまう。
ナイーブなGPU版GiSTインデックス実装(9月末)
PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平27
GPUの利用効率が上がらず、しばしばCPUより低速だった
● ● ● ● ● ● ●●
各スレッドが1行分のデータをロード
GiST-Index探索用のキー値を抽出する。
GiST-Indexにヒットした?
キー値を用いてGiST-Indexを探索する
JOIN結合条件は真?
JOIN結合条件を評価する
nitems個分のJOIN結果を書き出し
nitems = __syncthreads_count(found);
繰り返し
found=true
found=false
No
No
スレッドグループ(512スレッド)内に、
1個でもGiST-IndexのLeafまで降下して
探索したり、JOIN結合条件の評価まで
行うスレッドがいると、他の511スレッ
ドはその完了を待たされてしまう。
結果として、GPUコアの使用率が全く
向上しないという事になる。
GPUのスレッドスケジューリングを意識した実装(11月頭)
PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平28
できる限りコアが遊ばないよう、同期ポイントを最小化
● ● ● ● ● ● ●●
各Warp(32スレッド)毎に1行分のデータをロード
GiST-Index探索用のキー値を抽出する。
キー値を用いてGiST-Indexを探索する
GiST-Indexにヒットした?
Atomic演算を用いて中間バッファの領域を確保
GiST-Indexにヒットした行のポインタを記録
中間バッファの使用量が
512個を越えた
__syncthreads()
中間バッファを元に、JOIN結合条件を評価する
JOIN結合条件は真?
No
No
nitems = __syncthreads_count(found)
nitems個分のJOIN結果を書き出し
繰り返し
found=false
found=true
中間バッファの使用量に余裕がある限り、
同期ポイントに達する前にどんどん
Readポインタを進めて GiST-Index の
探索を進める。
➔ 一部のWarp(スレッド)で探索に
時間を要しても、他のWarpは先に
次の行を処理できるため、
GPUコアの使用率を高くできる。
簡易テスト:ランダムな点とSt_Contains(最新版)
PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平29
(123.0, 20.0)
(154.2, 46.2)
SELECT n03_001,n03_004,count(*)
FROM geo_japan j, geopoint p
WHERE st_contains(j.geom, st_makepoint(x,y))
AND j.n03_001 like '東京都’
GROUP BY n03_001,n03_004;
ランダムに
生成した座標
1000万個
n03_001 | n03_004 | count
---------+------------+-------
東京都 | あきる野市 | 105
東京都 | 三宅村 | 76
東京都 | 三鷹市 | 17
東京都 | 世田谷区 | 67
東京都 | 中央区 | 12
東京都 | 中野区 | 18
東京都 | 八丈町 | 105
: : :
東京都 | 豊島区 | 14
東京都 | 足立区 | 55
東京都 | 青ヶ島村 | 7
東京都 | 青梅市 | 117
(63 rows)
CPU版:24.892s
GPU版: 3.733s
国土地理院からDLした
全国市町村形状データ
6倍強の
高速化
簡易テストの実行計画(CPU版)
PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平30
postgres=# EXPLAIN (analyze, costs off)
SELECT n03_001,n03_004,count(*)
FROM geo_japan j, geopoint p
WHERE st_contains(j.geom, st_makepoint(x,y))
AND j.n03_001 like '東京都’
GROUP BY n03_001,n03_004;
QUERY PLAN
----------------------------------------------------------------------------------------
Finalize GroupAggregate (actual time=24880.443..24880.682 rows=63 loops=1)
Group Key: j.n03_001, j.n03_004
-> Gather Merge (actual time=24880.430..24892.342 rows=299 loops=1)
Workers Planned: 4
Workers Launched: 4
-> Partial GroupAggregate (actual time=24855.860..24855.949 rows=60 loops=5)
Group Key: j.n03_001, j.n03_004
-> Sort (actual time=24855.846..24855.865 rows=529 loops=5)
Sort Key: j.n03_001, j.n03_004
Sort Method: quicksort Memory: 64kB
-> Nested Loop (actual time=50.124..24854.788 rows=529 loops=5)
-> Parallel Seq Scan on geopoint p (actual time=0.120..258.900
rows=2000000 loops=5)
-> Index Scan using geo_japan_geom_idx on geo_japan j
(actual time=0.012..0.012 rows=0 loops=10000000)
Index Cond: (geom ~ st_makepoint(p.x, p.y))
Filter: (((n03_001)::text ~~ '東京都'::text) AND
st_contains(geom, st_makepoint(p.x, p.y)))
Rows Removed by Filter: 0
Planning Time: 0.160 ms
Execution Time: 24892.586 ms
(22 rows)
簡易テストの実行計画(GPU版)
PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平31
postgres=# EXPLAIN (analyze, costs off)
SELECT n03_001,n03_004,count(*)
FROM geo_japan j, fgeopoint p
WHERE st_contains(j.geom, st_makepoint(x,y))
AND j.n03_001 like '東京都’
GROUP BY n03_001,n03_004;
QUERY PLAN
-----------------------------------------------------------------------------------------------
HashAggregate (actual time=3725.900..3725.938 rows=63 loops=1)
Group Key: j.n03_001, j.n03_004
-> Custom Scan (GpuJoin) on fgeopoint p (actual time=3725.169..3725.415 rows=2646 loops=1)
Outer Scan: fgeopoint p (never executed)
Depth 1: GpuGiSTJoin
HeapSize: 7841.91KB (estimated: 3113.70KB), IndexSize: 13.28MB
IndexFilter: (j.geom ~ st_makepoint(p.x, p.y)) on geo_japan_geom_idx
Rows Fetched by Index: 5065
JoinQuals: st_contains(j.geom, st_makepoint(p.x, p.y))
GPU Preference: GPU0 (Tesla V100-PCIE-16GB)
-> Seq Scan on geo_japan j (actual time=0.154..17.959 rows=6173 loops=1)
Filter: ((n03_001)::text ~~ '東京都'::text)
Rows Removed by Filter: 112726
Planning Time: 0.297 ms
Execution Time: 3733.403 ms
(15 rows)
GPU版に固有の最適化
PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平32
▌ PostgreSQLの場合、Indexに付随する条件句の評価は、Indexを用いて候補となる行を取り出し
た後にしか行えない。つまり、結果的に無駄となる行フェッチが発生する。
▌ GPU版GiSTインデックスでは、予め「明らかに条件に該当しないエントリ」のLeaf要素を無効
化するため、何度も何度も自明な条件句の評価を行う必要はない。
➔ 『1週間分のデータから直近30分のイベントだけを取り出す』といった特性がある場合に、
通常のGiSTインデックス探索よりも有利に働く。
GiST Rootブロック
IndexTupleData
IndexTupleData
IndexTupleData
IndexTupleData
IndexTupleData
IndexTupleData
IndexTupleData
notinuse
EXPLAIN
SELECT n03_001,n03_004,count(*)
FROM geo_japan j, geopoint p
WHERE st_contains(j.geom, st_makepoint(x,y))
AND j.n03_001 like '東京都’
GROUP BY n03_001,n03_004;
QUERY PLAN
------------------------------------------------------
GroupAggregate
Group Key: j.n03_001, j.n03_004
-> Sort
Sort Key: j.n03_001, j.n03_004
-> Nested Loop
-> Seq Scan on geopoint p
-> Index Scan using geo_japan_geom_idx on geo_japan j
Index Cond: (geom ~ st_makepoint(p.x, p.y))
Filter: (((n03_001)::text ~~ '東京都') AND
st_contains(geom, st_makepoint(p.x, p.y)))
(9 rows)あらかじめ、明らかに条件に該当しないエントリ
(この場合は ‘東京都’ 以外)を無効化
小噺)ちょっと感動した話
postgres=# EXPLAIN SELECT n03_001,n03_004,count(*)
FROM geo_japan j, geopoint p
WHERE st_dwithin(j.geom, st_makepoint(x,y), 0.004)
AND j.n03_001 like '東京都’
GROUP BY n03_001,n03_004;
QUERY PLAN
-----------------------------------------------------------------------------------------------------
HashAggregate (cost=1936845.15..1936893.73 rows=4858 width=29)
Group Key: j.n03_001, j.n03_004
-> Custom Scan (GpuJoin) on geopoint p (cost=159401.97..1480539.90 rows=60840700 width=21)
Outer Scan: geopoint p (cost=0.00..163696.15 rows=10000115 width=16)
Depth 1: GpuGiSTJoin(nrows 10000115...60840700)
HeapSize: 3113.70KB
IndexFilter: (j.geom && st_expand(st_makepoint(p.x, p.y),
'0.004'::double precision)) on geo_japan_geom_idx
JoinQuals: st_dwithin(j.geom, st_makepoint(p.x, p.y), '0.004'::double precision)
GPU Preference: GPU0 (Tesla V100-PCIE-16GB)
-> Seq Scan on geo_japan j (cost=0.00..8928.24 rows=6084 width=1868)
Filter: ((n03_001)::text ~~ '東京都'::text)
(11 rows)
PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平33
st_makepoint(p.x, p.y)
st_expand()
✓ 引数1(点)を上下左右に引数2(実数)だけ拡張
した矩形領域を返す。
➔ これとGiSTインデックスのBounding-Boxが
共通領域を持てば、st_dwithin()が真となる
可能性がある。
0.004
0.004
リアルタイムデータ分析のための
GPUメモリストア(Gstore_Fdw)
PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平34
IoT/M2MデータのライフサイクルとPG-Stromの機能
時系列データ
(数TB~)
前処理済みデータ
リアルタイムデータ
ETL・
前処理
課題:
大容量データの保存・読出し
課題:
高頻度な更新と高速な解析処理の両立
Apache Arrow対応
(Arrow_Fdw)
SSD-to-GPU
Direct SQL
BRIN-Index
GPU Memory Store
(Gstore_Fdw)
RuntimeGPUCodeGeneration
PostGIS/JSONdatasupport
NEWNEW
PG-Strom機能群
データ量:大
データ量:小
従来のスコープ
PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平35
背景と課題
▌GPUとホストメモリは“遠い”
 通常、GPUはPCI-Eバスを介してホストシステムと接続する。
 PCI-E Gen 3.0 x16レーンだと、片方向 16GB/s 「しかない」
行って帰ってのレイテンシは数十マイクロ秒単位。
 DRAMの転送速度は140GB/sでレイテンシは100ns程度。
もしL1/L2に載っていれば数ns単位でアクセス可能
出展:https://gist.github.com/eshelman/343a1c46cb3fba142c1afdcdeec17646
▌高い更新頻度
 もし100万デバイスが10秒に一度、
現在位置を更新するなら?
➔ 単純 UPDATE を毎秒10万回実行。
➔ 1.0sec / 10万 = 10us
▌リアルタイム性に対する要請
 利用者が検索、解析したいのは、
「その時点での最新の状態」
➔ 後でまとめてバッチ、では通用しない。
GPU
Device
RAM
RAMCPU
900GB/s
140GB/s
16GB/s
PCI-E
Gen3.0
PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平36
Gstore_Fdwアーキテクチャ
REDOログを利用してGPUメモリ側を非同期に更新する。
検索クエリの実行前に更新を適用すれば辻褄は合う!
Host Memory
Store
REDO Log
Buffer
Base File Redo File
Host
Memory
Storage
GPU
Device
Memory
Store
PostgreSQL Backend
(OLTP系)
PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平37
PostgreSQL Backend
(OLTP系)
PostgreSQL Backend
(OLTP系)
INSERT
UPDATE
DELETE
ログ追記
更新系処理では
一切GPUにタッチしない
Gstore_Fdwアーキテクチャ
REDOログを利用してGPUメモリ側を非同期に更新する。
検索クエリの実行前に更新を適用すれば辻褄は合う!
Host Memory
Store
REDO Log
Buffer
Base File Redo File
Host
Memory
Storage
GPU
Device
Memory
Store
PostgreSQL
BG-Worker
(GPUバッファ管理)
PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平38
①未適用分のログ転送
GPU Kernel
to apply
REDO Log
数千スレッドで動作
ほぼ一瞬で適用できる
②GPUカーネルの起動
Gstore_Fdwアーキテクチャ
REDOログを利用してGPUメモリ側を非同期に更新する。
検索クエリの実行前に更新を適用すれば辻褄は合う!
Host Memory
Store
REDO Log
Buffer
Base File Redo File
Host
Memory
Storage
GPU
Device
Memory
Store
PostgreSQL
Backend
(解析系SQL)
PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平39
①未適用分のログ転送
GPU Kernel
to apply
REDO Log
SQL処理の前に REDO ログを
適用すれば、辻褄はあう
(一貫性が保たれる)
GPU Kernel
to execute
SQL
②GPUカーネルの起動
Gstore_Fdw外部テーブルの定義
CREATE FOREIGN TABLE ft (
id int,
x float,
y float,
z text
) server gstore_fdw
options (gpu_device_id '1',
base_file '/opt/pgdata-dev/ft.base',
redo_log_file '/opt/pmem-dev/ft.redo’,
max_num_rows '4000000',
primary_key 'id');
(補足)
 base_fileはNVMEストレージ上に配置するのが望ましい。
✓ mmap(2)してバイト単位のランダムアクセスが多発するため、
PMEMの微妙なアクセスの遅さが性能差として見えてしまう。
 redo_log_fileはPMEM上に配置するのが望ましい。
✓ トランザクションのコミット時にREDOログを永続化する必要があるため。
追記書き出しのみだが、細かい単位でCPUキャッシュをフラッシュする。
(逆にブロックデバイスのようなfsyncは必要ないが)
PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平40
更新処理のパフォーマンス(1/2)
--- 200万行を投入
INSERT INTO ft (SELECT x, 100*random(),
100*random(),
md5(x::text)
FROM generate_series(1,2000000) x);
--- 座標に見立てたx,yをランダムな値で更新
--- (pgbenchでクライアント数:20を想定)
UPDATE ft SET x = 100*random(),
y = 100*random()
WHERE id = (SELECT 20*(100000.0*random())::int + :client_id);
--- 実行計画
EXPLAIN ....;
QUERY PLAN
-------------------------------------------------------------------
Update on ft (cost=0.02..100.03 rows=10000 width=58)
InitPlan 1 (returns $0)
-> Result (cost=0.00..0.02 rows=1 width=4)
-> Foreign Scan on ft (cost=0.00..100.01 rows=10000 width=58)
Filter: (id = $0)
Index Cond: id = $0
(6 rows)
PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平41
更新処理のパフォーマンス(2/2)
$ pgbench -p 6543 postgres -n -f test.sql -c 20 -j 10 -T 10
transaction type: test.sql
scaling factor: 1
query mode: simple
number of clients: 20
number of threads: 10
duration: 10 s
number of transactions actually processed: 1236401
latency average = 0.162 ms
tps = 123631.393482 (including connections establishing)
tps = 123674.819689 (excluding connections establishing)
(補足)
 まだ排他ロックで実装している箇所があり、クライアント数が20を越えた辺りで
サチり始める。
➔ Atomic演算による置き換えや、マルチGPU化による排他ロック自身の分散。
 PostgreSQLの通常テーブル(on NVME-SSD):
20クライアント 65k TPS、80クライアント160k TPS程度
 通常テーブルと外部テーブルの内部ロジックの違いに起因する差異は未検証
PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平42
検索処理のパフォーマンス(再掲)
--- GpuScan (GPU版PostGIS) + Gstore_Fdw
=# SELECT count(*) FROM ft
WHERE st_contains('polygon ((10 10,90 10,90 12,12 12,12 88,90 88,90 90,¥
10 90,10 10))’, st_makepoint(x,y));
count
-------
94440
(1 row)
Time: 75.466 ms
--- 通常版PostGIS + PostgreSQLテーブル
=# SET pg_strom.enabled = off;
SET
=# SELECT count(*) FROM tt
WHERE st_contains('polygon ((10 10,90 10,90 12,12 12,12 88,90 88,90 90,¥
10 90,10 10))', st_makepoint(x,y));
count
-------
94440
(1 row)
Time: 332.300 ms
200万個のPointから、
指定領域内の数をカウント
PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平43
Gstore_Fdw機能の今後
PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平44
モデル名 p3.2xlarge p3.8xlarge p3.16xlarge NC6s v NC12s v3 NC24s v3
vCPU 8 core 32 core 64 core 6 core 12 core 24 core
RAM 61GB 244GB 488GB 112 GB 224 GB 448 GB
GPU 1 x Tesla V100
(16GB; 5120C)
4 x Tesla V100
(16GB; 5120C)
8 x Tesla V100
(16GB; 5120C)
1 x Tesla V100
(16GB; 5120C)
2 x Tesla V100
(16GB; 5120C)
4 x Tesla V100
(16GB; 5120C)
オンデマンド
料金 4.194USD/h 16.776USD/h 32.552USD/h ¥469.73/h ¥939.46/h ¥2066.85/h
※ オンデマンド料金は、各社東京リージョンの本体のみ単価(2020/11/11現在)で記載。
▌機能強化
 マルチGPU(マルチバッファ)への対応
✓ GPUバッファ容量の拡大と、分析時に複数台のGPUへ負荷を割り振る効果。
✓ 更新時の排他ロックを分散させる効果。
 継続的なソフトウェア品質改善
▌クラウド提供
 従来のNVME-GPU連携フォーカスと異なり、
GPUのみでシステムを構成できるためハードウェア要件が緩い。
WIP
PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平45
GPU版PostGIS(GiSTインデックス)を用いた
実ワークロードの性能評価
位置データアプリケーションを用いた評価
ユーザ毎・都道府県ごとに、訪問した
(近傍のチェックイン履歴のある)駅の
割合を導出し、都道府県ごとの
駅制覇マップを作成する。
PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平46
検索における工夫
PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平47
近傍に位置する駅は両方訪問した事にする。
大阪梅田
東京メトロ銀座線京橋駅と、
都営浅草線京橋駅
西武鉄道 西武秩父駅と、
秩父鉄道 御花畑駅
JR武蔵野線 北朝霞駅と、
東武東上線 朝霞台駅
集計クエリの構造
PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平48
TRUNCATE train_visit_summary;
INSERT INTO train_visit_summary (
-- 集計結果を集計テーブルに保持しておき、Web画面の表示時に
-- 未訪問の都道府県も含めて出力する。
WITH cte_station_visit AS (
SELECT DISTINCT s.pref_cd, s.station_cd, u.uid
-- “訪問”した駅コード、その都道府県コード、ユーザIDを
-- 重複なしで取り出す
FROM train_station_list s, train_user_station u
-- 駅の位置と、ユーザのチェックイン情報を突合する
WHERE st_dwithin(st_makepoint(s.lon, s.lat),
st_makepoint(u.lon, u.lat), 0.004)
-- 駅の位置とユーザのチェックイン情報の位置が一定範囲内に存在すれば、
-- その駅を訪問したものとみなす。
AND s.station_cd = s.station_g_cd
)
SELECT v.pref_cd, v.uid, count(*)
INTO train_visit_summary
FROM cte_station_visit v
GROUP BY 1, 2
);
(ユーザ, 都道府県)ごとに、訪問した駅の数を集計
実行結果(CPU)
PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平49
QUERY PLAN
------------------------------------------------------------------------------------------
Insert on train_visit_summary (actual time=564337.937..564337.937 rows=0 loops=1)
-> Subquery Scan on "*SELECT*" (actual time=561347.255..564263.657 rows=222985 loops=1)
-> GroupAggregate (actual time=561347.253..564245.853 rows=222985 loops=1)
Group Key: v.pref_cd, v.uid
-> Sort (actual time=561347.227..562318.377 rows=18041063 loops=1)
Sort Key: v.pref_cd, v.uid
Sort Method: quicksort Memory: 1632107kB
-> Subquery Scan on v (actual time=534684.752..543837.130 rows=18041063 loops=1)
-> Group (actual time=534684.748..542789.954 rows=18041063 loops=1)
Group Key: s.pref_cd, s.station_cd, u.uid
-> Sort (actual time=534684.737..538315.419 rows=31188357 loops=1)
Sort Key: s.pref_cd, s.station_cd, u.uid
Sort Method: quicksort Memory: 2248387kB
-> Nested Loop (actual time=0.072..485222.366 rows=31188357 loops=1)
-> Seq Scan on train_user_station u
(actual time=0.010..2436.186 rows=23969240 loops=1)
-> Index Scan using train_station_list_st_makepoint_idx on train_station_list s
(actual time=0.018..0.019 rows=1 loops=23969240)
Index Cond: (st_makepoint(lon, lat) &&
st_expand(st_makepoint(u.lon, u.lat), 0.004))
Filter: ((station_cd = station_g_cd) AND
st_dwithin(st_makepoint(lon, lat),
st_makepoint(u.lon, u.lat), 0.004))
Rows Removed by Filter: 1
Planning Time: 0.241 ms
Execution Time: 564369.525 ms
(21 rows)
実行結果(GPU)
PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平50
QUERY PLAN
------------------------------------------------------------------------------------------
Insert on train_visit_summary (actual time=29994.448..29994.448 rows=0 loops=1)
-> Subquery Scan on "*SELECT*" (actual time=29873.410..29925.354 rows=222985 loops=1)
-> HashAggregate (actual time=29873.407..29911.557 rows=222985 loops=1)
Group Key: s.pref_cd, u.uid
-> HashAggregate (actual time=22546.625..26156.456 rows=18041063 loops=1)
Group Key: s.pref_cd, s.station_cd, u.uid
-> Custom Scan (GpuJoin) on train_user_station u
(actual time=614.179..14651.453 rows=31188357 loops=1)
Outer Scan: train_user_station u
(actual time=49.108..2245.314 rows=23969240 loops=1)
Depth 1: GpuGiSTJoin
HeapSize: 992.73KB (estimated: 13.12KB), IndexSize: 928.62KB
IndexFilter: (st_makepoint(s.lon, s.lat) &&
st_expand(st_makepoint(u.lon, u.lat), 0.004))
on train_station_list_st_makepoint_idx
Rows Fetched by Index: 33137684
JoinQuals: st_dwithin(st_makepoint(s.lon, s.lat),
st_makepoint(u.lon, u.lat), 0.004)
GPU Preference: GPU0 (Tesla V100-PCIE-16GB)
-> Seq Scan on train_station_list s
(actual time=0.020..2.591 rows=12542 loops=1)
Filter: (station_cd = station_g_cd)
Rows Removed by Filter: 2534
Planning Time: 0.513 ms
Execution Time: 30087.473 ms
(19 rows)
まとめ(1/2)
PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平51
▌GPU版PostGIS
 PostGIS関数をGPU上で並列実行するための機能拡張。
 GiSTインデックスにも対応し、H/Wの特性を活かしたインデックス探索を実装。
▌GPUメモリストア
 リアルタイムのデータ更新と分析ワークロードを両立するための機能。
 GPUにデータを常駐させ、PMEMを利用してトランザクションを永続化。
▌想定用途
 携帯電話や自動車の“位置情報“と、エリア定義情報との突合。
 リアルタイムの広告配信やプッシュ型イベント通知など。
 これら位置情報分析を含む “計算ヘビー“ なワークロードを
手元のワークステーションやクラウドで手軽に実行できるように。
▌リソース
 GitHub: https://github.com/heterodb/pg-strom
 Document: http://heterodb.github.io/pg-strom/ja/
 Contact: Tw: @kkaigai / ✉ kaigai@heterodb.com
まとめ(2/2)
PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平52
▌リソース
 GitHub: https://github.com/heterodb/pg-strom
 Document: http://heterodb.github.io/pg-strom/ja/
 Contact: Tw: @kkaigai / ✉ kaigai@heterodb.com
PG-Stromプロジェクトは皆さんのご参加を歓迎します
THANK YOU!
20201113_PGconf_Japan_GPU_PostGIS

More Related Content

What's hot

20190516_DLC10_PGStrom
20190516_DLC10_PGStrom20190516_DLC10_PGStrom
20190516_DLC10_PGStromKohei KaiGai
 
[20170922 Sapporo Tech Bar] 地図用データを高速処理!オープンソースGPUデータベースMapDってどんなもの?? by 株式会社...
[20170922 Sapporo Tech Bar] 地図用データを高速処理!オープンソースGPUデータベースMapDってどんなもの?? by 株式会社...[20170922 Sapporo Tech Bar] 地図用データを高速処理!オープンソースGPUデータベースMapDってどんなもの?? by 株式会社...
[20170922 Sapporo Tech Bar] 地図用データを高速処理!オープンソースGPUデータベースMapDってどんなもの?? by 株式会社...Insight Technology, Inc.
 
20190418_PGStrom_on_ArrowFdw
20190418_PGStrom_on_ArrowFdw20190418_PGStrom_on_ArrowFdw
20190418_PGStrom_on_ArrowFdwKohei KaiGai
 
20180914 GTCJ INCEPTION HeteroDB
20180914 GTCJ INCEPTION HeteroDB20180914 GTCJ INCEPTION HeteroDB
20180914 GTCJ INCEPTION HeteroDBKohei KaiGai
 
20191211_Apache_Arrow_Meetup_Tokyo
20191211_Apache_Arrow_Meetup_Tokyo20191211_Apache_Arrow_Meetup_Tokyo
20191211_Apache_Arrow_Meetup_TokyoKohei KaiGai
 
20200424_Writable_Arrow_Fdw
20200424_Writable_Arrow_Fdw20200424_Writable_Arrow_Fdw
20200424_Writable_Arrow_FdwKohei KaiGai
 
20171212_GTCJapan_InceptionSummt_HeteroDB
20171212_GTCJapan_InceptionSummt_HeteroDB20171212_GTCJapan_InceptionSummt_HeteroDB
20171212_GTCJapan_InceptionSummt_HeteroDBKohei KaiGai
 
20171220_hbstudy80_pgstrom
20171220_hbstudy80_pgstrom20171220_hbstudy80_pgstrom
20171220_hbstudy80_pgstromKohei KaiGai
 
20190926_Try_RHEL8_NVMEoF_Beta
20190926_Try_RHEL8_NVMEoF_Beta20190926_Try_RHEL8_NVMEoF_Beta
20190926_Try_RHEL8_NVMEoF_BetaKohei KaiGai
 
pgconfasia2016 lt ssd2gpu
pgconfasia2016 lt ssd2gpupgconfasia2016 lt ssd2gpu
pgconfasia2016 lt ssd2gpuKohei KaiGai
 
20170127 JAWS HPC-UG#8
20170127 JAWS HPC-UG#820170127 JAWS HPC-UG#8
20170127 JAWS HPC-UG#8Kohei KaiGai
 
SQL+GPU+SSD=∞ (Japanese)
SQL+GPU+SSD=∞ (Japanese)SQL+GPU+SSD=∞ (Japanese)
SQL+GPU+SSD=∞ (Japanese)Kohei KaiGai
 
押さえておきたい、PostgreSQL 13 の新機能!! (PostgreSQL Conference Japan 2020講演資料)
押さえておきたい、PostgreSQL 13 の新機能!! (PostgreSQL Conference Japan 2020講演資料)押さえておきたい、PostgreSQL 13 の新機能!! (PostgreSQL Conference Japan 2020講演資料)
押さえておきたい、PostgreSQL 13 の新機能!! (PostgreSQL Conference Japan 2020講演資料)NTT DATA Technology & Innovation
 
[db tech showcase Tokyo 2017] B35: 地図用データを高速処理!オープンソースGPUデータベースMapDの魅力に迫る!!by...
[db tech showcase Tokyo 2017] B35: 地図用データを高速処理!オープンソースGPUデータベースMapDの魅力に迫る!!by...[db tech showcase Tokyo 2017] B35: 地図用データを高速処理!オープンソースGPUデータベースMapDの魅力に迫る!!by...
[db tech showcase Tokyo 2017] B35: 地図用データを高速処理!オープンソースGPUデータベースMapDの魅力に迫る!!by...Insight Technology, Inc.
 
20170329_BigData基盤研究会#7
20170329_BigData基盤研究会#720170329_BigData基盤研究会#7
20170329_BigData基盤研究会#7Kohei KaiGai
 
20180217 FPGA Extreme Computing #10
20180217 FPGA Extreme Computing #1020180217 FPGA Extreme Computing #10
20180217 FPGA Extreme Computing #10Kohei KaiGai
 
PL/CUDA - Fusion of HPC Grade Power with In-Database Analytics
PL/CUDA - Fusion of HPC Grade Power with In-Database AnalyticsPL/CUDA - Fusion of HPC Grade Power with In-Database Analytics
PL/CUDA - Fusion of HPC Grade Power with In-Database AnalyticsKohei KaiGai
 
SSDとGPUがPostgreSQLを加速する【OSC.Enterprise】
SSDとGPUがPostgreSQLを加速する【OSC.Enterprise】SSDとGPUがPostgreSQLを加速する【OSC.Enterprise】
SSDとGPUがPostgreSQLを加速する【OSC.Enterprise】Kohei KaiGai
 
20170310_InDatabaseAnalytics_#1
20170310_InDatabaseAnalytics_#120170310_InDatabaseAnalytics_#1
20170310_InDatabaseAnalytics_#1Kohei KaiGai
 
(JP) GPGPUがPostgreSQLを加速する
(JP) GPGPUがPostgreSQLを加速する(JP) GPGPUがPostgreSQLを加速する
(JP) GPGPUがPostgreSQLを加速するKohei KaiGai
 

What's hot (20)

20190516_DLC10_PGStrom
20190516_DLC10_PGStrom20190516_DLC10_PGStrom
20190516_DLC10_PGStrom
 
[20170922 Sapporo Tech Bar] 地図用データを高速処理!オープンソースGPUデータベースMapDってどんなもの?? by 株式会社...
[20170922 Sapporo Tech Bar] 地図用データを高速処理!オープンソースGPUデータベースMapDってどんなもの?? by 株式会社...[20170922 Sapporo Tech Bar] 地図用データを高速処理!オープンソースGPUデータベースMapDってどんなもの?? by 株式会社...
[20170922 Sapporo Tech Bar] 地図用データを高速処理!オープンソースGPUデータベースMapDってどんなもの?? by 株式会社...
 
20190418_PGStrom_on_ArrowFdw
20190418_PGStrom_on_ArrowFdw20190418_PGStrom_on_ArrowFdw
20190418_PGStrom_on_ArrowFdw
 
20180914 GTCJ INCEPTION HeteroDB
20180914 GTCJ INCEPTION HeteroDB20180914 GTCJ INCEPTION HeteroDB
20180914 GTCJ INCEPTION HeteroDB
 
20191211_Apache_Arrow_Meetup_Tokyo
20191211_Apache_Arrow_Meetup_Tokyo20191211_Apache_Arrow_Meetup_Tokyo
20191211_Apache_Arrow_Meetup_Tokyo
 
20200424_Writable_Arrow_Fdw
20200424_Writable_Arrow_Fdw20200424_Writable_Arrow_Fdw
20200424_Writable_Arrow_Fdw
 
20171212_GTCJapan_InceptionSummt_HeteroDB
20171212_GTCJapan_InceptionSummt_HeteroDB20171212_GTCJapan_InceptionSummt_HeteroDB
20171212_GTCJapan_InceptionSummt_HeteroDB
 
20171220_hbstudy80_pgstrom
20171220_hbstudy80_pgstrom20171220_hbstudy80_pgstrom
20171220_hbstudy80_pgstrom
 
20190926_Try_RHEL8_NVMEoF_Beta
20190926_Try_RHEL8_NVMEoF_Beta20190926_Try_RHEL8_NVMEoF_Beta
20190926_Try_RHEL8_NVMEoF_Beta
 
pgconfasia2016 lt ssd2gpu
pgconfasia2016 lt ssd2gpupgconfasia2016 lt ssd2gpu
pgconfasia2016 lt ssd2gpu
 
20170127 JAWS HPC-UG#8
20170127 JAWS HPC-UG#820170127 JAWS HPC-UG#8
20170127 JAWS HPC-UG#8
 
SQL+GPU+SSD=∞ (Japanese)
SQL+GPU+SSD=∞ (Japanese)SQL+GPU+SSD=∞ (Japanese)
SQL+GPU+SSD=∞ (Japanese)
 
押さえておきたい、PostgreSQL 13 の新機能!! (PostgreSQL Conference Japan 2020講演資料)
押さえておきたい、PostgreSQL 13 の新機能!! (PostgreSQL Conference Japan 2020講演資料)押さえておきたい、PostgreSQL 13 の新機能!! (PostgreSQL Conference Japan 2020講演資料)
押さえておきたい、PostgreSQL 13 の新機能!! (PostgreSQL Conference Japan 2020講演資料)
 
[db tech showcase Tokyo 2017] B35: 地図用データを高速処理!オープンソースGPUデータベースMapDの魅力に迫る!!by...
[db tech showcase Tokyo 2017] B35: 地図用データを高速処理!オープンソースGPUデータベースMapDの魅力に迫る!!by...[db tech showcase Tokyo 2017] B35: 地図用データを高速処理!オープンソースGPUデータベースMapDの魅力に迫る!!by...
[db tech showcase Tokyo 2017] B35: 地図用データを高速処理!オープンソースGPUデータベースMapDの魅力に迫る!!by...
 
20170329_BigData基盤研究会#7
20170329_BigData基盤研究会#720170329_BigData基盤研究会#7
20170329_BigData基盤研究会#7
 
20180217 FPGA Extreme Computing #10
20180217 FPGA Extreme Computing #1020180217 FPGA Extreme Computing #10
20180217 FPGA Extreme Computing #10
 
PL/CUDA - Fusion of HPC Grade Power with In-Database Analytics
PL/CUDA - Fusion of HPC Grade Power with In-Database AnalyticsPL/CUDA - Fusion of HPC Grade Power with In-Database Analytics
PL/CUDA - Fusion of HPC Grade Power with In-Database Analytics
 
SSDとGPUがPostgreSQLを加速する【OSC.Enterprise】
SSDとGPUがPostgreSQLを加速する【OSC.Enterprise】SSDとGPUがPostgreSQLを加速する【OSC.Enterprise】
SSDとGPUがPostgreSQLを加速する【OSC.Enterprise】
 
20170310_InDatabaseAnalytics_#1
20170310_InDatabaseAnalytics_#120170310_InDatabaseAnalytics_#1
20170310_InDatabaseAnalytics_#1
 
(JP) GPGPUがPostgreSQLを加速する
(JP) GPGPUがPostgreSQLを加速する(JP) GPGPUがPostgreSQLを加速する
(JP) GPGPUがPostgreSQLを加速する
 

Similar to 20201113_PGconf_Japan_GPU_PostGIS

GPUとSSDがPostgreSQLを加速する~クエリ処理スループット10GB/sへの挑戦~ [DB Tech Showcase Tokyo/2017]
GPUとSSDがPostgreSQLを加速する~クエリ処理スループット10GB/sへの挑戦~ [DB Tech Showcase Tokyo/2017]GPUとSSDがPostgreSQLを加速する~クエリ処理スループット10GB/sへの挑戦~ [DB Tech Showcase Tokyo/2017]
GPUとSSDがPostgreSQLを加速する~クエリ処理スループット10GB/sへの挑戦~ [DB Tech Showcase Tokyo/2017]Kohei KaiGai
 
20221116_DBTS_PGStrom_History
20221116_DBTS_PGStrom_History20221116_DBTS_PGStrom_History
20221116_DBTS_PGStrom_HistoryKohei KaiGai
 
FPGAによる大規模データ処理の高速化
FPGAによる大規模データ処理の高速化FPGAによる大規模データ処理の高速化
FPGAによる大規模データ処理の高速化Kazunori Sato
 
20180920_DBTS_PGStrom_JP
20180920_DBTS_PGStrom_JP20180920_DBTS_PGStrom_JP
20180920_DBTS_PGStrom_JPKohei KaiGai
 
20181212 - PGconf.ASIA - LT
20181212 - PGconf.ASIA - LT20181212 - PGconf.ASIA - LT
20181212 - PGconf.ASIA - LTKohei KaiGai
 
ONIC2017 プログラマブル・データプレーン時代に向けた ネットワーク・オペレーションスタック
ONIC2017 プログラマブル・データプレーン時代に向けた ネットワーク・オペレーションスタックONIC2017 プログラマブル・データプレーン時代に向けた ネットワーク・オペレーションスタック
ONIC2017 プログラマブル・データプレーン時代に向けた ネットワーク・オペレーションスタックKentaro Ebisawa
 
An Intelligent Storage?
An Intelligent Storage?An Intelligent Storage?
An Intelligent Storage?Kohei KaiGai
 
MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜
MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜
MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜Takahiro Inoue
 
Kubernetes on Alibaba Cloud
Kubernetes on Alibaba CloudKubernetes on Alibaba Cloud
Kubernetes on Alibaba Cloud真吾 吉田
 
Magnum IO GPUDirect Storage 最新情報
Magnum IO GPUDirect Storage 最新情報Magnum IO GPUDirect Storage 最新情報
Magnum IO GPUDirect Storage 最新情報NVIDIA Japan
 
俺的 Ignite update 萌えポイント portal&arm, compute, network -
俺的 Ignite update 萌えポイント   portal&arm, compute, network -俺的 Ignite update 萌えポイント   portal&arm, compute, network -
俺的 Ignite update 萌えポイント portal&arm, compute, network -Yui Ashikaga
 
トレジャーデータのバッチクエリとアドホッククエリを理解する
トレジャーデータのバッチクエリとアドホッククエリを理解するトレジャーデータのバッチクエリとアドホッククエリを理解する
トレジャーデータのバッチクエリとアドホッククエリを理解するTakahiro Inoue
 
20170421 tensor flowusergroup
20170421 tensor flowusergroup20170421 tensor flowusergroup
20170421 tensor flowusergroupManaMurakami1
 
CEDEC 2015: Google スケールで実現する!ゲーム&分析基盤
CEDEC 2015: Google スケールで実現する!ゲーム&分析基盤CEDEC 2015: Google スケールで実現する!ゲーム&分析基盤
CEDEC 2015: Google スケールで実現する!ゲーム&分析基盤Google Cloud Platform - Japan
 
20171109 Amazon EC2 GPUインスタンス最新動向 P3 instance
20171109 Amazon EC2 GPUインスタンス最新動向 P3 instance20171109 Amazon EC2 GPUインスタンス最新動向 P3 instance
20171109 Amazon EC2 GPUインスタンス最新動向 P3 instanceAmazon Web Services Japan
 

Similar to 20201113_PGconf_Japan_GPU_PostGIS (19)

GPUとSSDがPostgreSQLを加速する~クエリ処理スループット10GB/sへの挑戦~ [DB Tech Showcase Tokyo/2017]
GPUとSSDがPostgreSQLを加速する~クエリ処理スループット10GB/sへの挑戦~ [DB Tech Showcase Tokyo/2017]GPUとSSDがPostgreSQLを加速する~クエリ処理スループット10GB/sへの挑戦~ [DB Tech Showcase Tokyo/2017]
GPUとSSDがPostgreSQLを加速する~クエリ処理スループット10GB/sへの挑戦~ [DB Tech Showcase Tokyo/2017]
 
20221116_DBTS_PGStrom_History
20221116_DBTS_PGStrom_History20221116_DBTS_PGStrom_History
20221116_DBTS_PGStrom_History
 
FPGAによる大規模データ処理の高速化
FPGAによる大規模データ処理の高速化FPGAによる大規模データ処理の高速化
FPGAによる大規模データ処理の高速化
 
20180920_DBTS_PGStrom_JP
20180920_DBTS_PGStrom_JP20180920_DBTS_PGStrom_JP
20180920_DBTS_PGStrom_JP
 
20181212 - PGconf.ASIA - LT
20181212 - PGconf.ASIA - LT20181212 - PGconf.ASIA - LT
20181212 - PGconf.ASIA - LT
 
ONIC2017 プログラマブル・データプレーン時代に向けた ネットワーク・オペレーションスタック
ONIC2017 プログラマブル・データプレーン時代に向けた ネットワーク・オペレーションスタックONIC2017 プログラマブル・データプレーン時代に向けた ネットワーク・オペレーションスタック
ONIC2017 プログラマブル・データプレーン時代に向けた ネットワーク・オペレーションスタック
 
An Intelligent Storage?
An Intelligent Storage?An Intelligent Storage?
An Intelligent Storage?
 
MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜
MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜
MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜
 
Kubernetes on Alibaba Cloud
Kubernetes on Alibaba CloudKubernetes on Alibaba Cloud
Kubernetes on Alibaba Cloud
 
Magnum IO GPUDirect Storage 最新情報
Magnum IO GPUDirect Storage 最新情報Magnum IO GPUDirect Storage 最新情報
Magnum IO GPUDirect Storage 最新情報
 
俺的 Ignite update 萌えポイント portal&arm, compute, network -
俺的 Ignite update 萌えポイント   portal&arm, compute, network -俺的 Ignite update 萌えポイント   portal&arm, compute, network -
俺的 Ignite update 萌えポイント portal&arm, compute, network -
 
Prometech Particleworks on Rescale
Prometech Particleworks on RescalePrometech Particleworks on Rescale
Prometech Particleworks on Rescale
 
トレジャーデータのバッチクエリとアドホッククエリを理解する
トレジャーデータのバッチクエリとアドホッククエリを理解するトレジャーデータのバッチクエリとアドホッククエリを理解する
トレジャーデータのバッチクエリとアドホッククエリを理解する
 
20170421 tensor flowusergroup
20170421 tensor flowusergroup20170421 tensor flowusergroup
20170421 tensor flowusergroup
 
ICD/CPSY 201412
ICD/CPSY 201412ICD/CPSY 201412
ICD/CPSY 201412
 
CEDEC 2015: Google スケールで実現する!ゲーム&分析基盤
CEDEC 2015: Google スケールで実現する!ゲーム&分析基盤CEDEC 2015: Google スケールで実現する!ゲーム&分析基盤
CEDEC 2015: Google スケールで実現する!ゲーム&分析基盤
 
Hadoop, NoSQL, GlusterFSの概要
Hadoop, NoSQL, GlusterFSの概要Hadoop, NoSQL, GlusterFSの概要
Hadoop, NoSQL, GlusterFSの概要
 
Cmc cmd slim
Cmc cmd slimCmc cmd slim
Cmc cmd slim
 
20171109 Amazon EC2 GPUインスタンス最新動向 P3 instance
20171109 Amazon EC2 GPUインスタンス最新動向 P3 instance20171109 Amazon EC2 GPUインスタンス最新動向 P3 instance
20171109 Amazon EC2 GPUインスタンス最新動向 P3 instance
 

More from Kohei KaiGai

20221111_JPUG_CustomScan_API
20221111_JPUG_CustomScan_API20221111_JPUG_CustomScan_API
20221111_JPUG_CustomScan_APIKohei KaiGai
 
20210928_pgunconf_hll_count
20210928_pgunconf_hll_count20210928_pgunconf_hll_count
20210928_pgunconf_hll_countKohei KaiGai
 
20210301_PGconf_Online_GPU_PostGIS_GiST_Index
20210301_PGconf_Online_GPU_PostGIS_GiST_Index20210301_PGconf_Online_GPU_PostGIS_GiST_Index
20210301_PGconf_Online_GPU_PostGIS_GiST_IndexKohei KaiGai
 
20201128_OSC_Fukuoka_Online_GPUPostGIS
20201128_OSC_Fukuoka_Online_GPUPostGIS20201128_OSC_Fukuoka_Online_GPUPostGIS
20201128_OSC_Fukuoka_Online_GPUPostGISKohei KaiGai
 
20201006_PGconf_Online_Large_Data_Processing
20201006_PGconf_Online_Large_Data_Processing20201006_PGconf_Online_Large_Data_Processing
20201006_PGconf_Online_Large_Data_ProcessingKohei KaiGai
 
20190909_PGconf.ASIA_KaiGai
20190909_PGconf.ASIA_KaiGai20190909_PGconf.ASIA_KaiGai
20190909_PGconf.ASIA_KaiGaiKohei KaiGai
 
20190314 PGStrom Arrow_Fdw
20190314 PGStrom Arrow_Fdw20190314 PGStrom Arrow_Fdw
20190314 PGStrom Arrow_FdwKohei KaiGai
 
20181212 - PGconfASIA - LT - English
20181212 - PGconfASIA - LT - English20181212 - PGconfASIA - LT - English
20181212 - PGconfASIA - LT - EnglishKohei KaiGai
 
20181211 - PGconf.ASIA - NVMESSD&GPU for BigData
20181211 - PGconf.ASIA - NVMESSD&GPU for BigData20181211 - PGconf.ASIA - NVMESSD&GPU for BigData
20181211 - PGconf.ASIA - NVMESSD&GPU for BigDataKohei KaiGai
 
20181210 - PGconf.ASIA Unconference
20181210 - PGconf.ASIA Unconference20181210 - PGconf.ASIA Unconference
20181210 - PGconf.ASIA UnconferenceKohei KaiGai
 
20181116 Massive Log Processing using I/O optimized PostgreSQL
20181116 Massive Log Processing using I/O optimized PostgreSQL20181116 Massive Log Processing using I/O optimized PostgreSQL
20181116 Massive Log Processing using I/O optimized PostgreSQLKohei KaiGai
 
20181016_pgconfeu_ssd2gpu_multi
20181016_pgconfeu_ssd2gpu_multi20181016_pgconfeu_ssd2gpu_multi
20181016_pgconfeu_ssd2gpu_multiKohei KaiGai
 
20181025_pgconfeu_lt_gstorefdw
20181025_pgconfeu_lt_gstorefdw20181025_pgconfeu_lt_gstorefdw
20181025_pgconfeu_lt_gstorefdwKohei KaiGai
 
20180920_DBTS_PGStrom_EN
20180920_DBTS_PGStrom_EN20180920_DBTS_PGStrom_EN
20180920_DBTS_PGStrom_ENKohei KaiGai
 

More from Kohei KaiGai (14)

20221111_JPUG_CustomScan_API
20221111_JPUG_CustomScan_API20221111_JPUG_CustomScan_API
20221111_JPUG_CustomScan_API
 
20210928_pgunconf_hll_count
20210928_pgunconf_hll_count20210928_pgunconf_hll_count
20210928_pgunconf_hll_count
 
20210301_PGconf_Online_GPU_PostGIS_GiST_Index
20210301_PGconf_Online_GPU_PostGIS_GiST_Index20210301_PGconf_Online_GPU_PostGIS_GiST_Index
20210301_PGconf_Online_GPU_PostGIS_GiST_Index
 
20201128_OSC_Fukuoka_Online_GPUPostGIS
20201128_OSC_Fukuoka_Online_GPUPostGIS20201128_OSC_Fukuoka_Online_GPUPostGIS
20201128_OSC_Fukuoka_Online_GPUPostGIS
 
20201006_PGconf_Online_Large_Data_Processing
20201006_PGconf_Online_Large_Data_Processing20201006_PGconf_Online_Large_Data_Processing
20201006_PGconf_Online_Large_Data_Processing
 
20190909_PGconf.ASIA_KaiGai
20190909_PGconf.ASIA_KaiGai20190909_PGconf.ASIA_KaiGai
20190909_PGconf.ASIA_KaiGai
 
20190314 PGStrom Arrow_Fdw
20190314 PGStrom Arrow_Fdw20190314 PGStrom Arrow_Fdw
20190314 PGStrom Arrow_Fdw
 
20181212 - PGconfASIA - LT - English
20181212 - PGconfASIA - LT - English20181212 - PGconfASIA - LT - English
20181212 - PGconfASIA - LT - English
 
20181211 - PGconf.ASIA - NVMESSD&GPU for BigData
20181211 - PGconf.ASIA - NVMESSD&GPU for BigData20181211 - PGconf.ASIA - NVMESSD&GPU for BigData
20181211 - PGconf.ASIA - NVMESSD&GPU for BigData
 
20181210 - PGconf.ASIA Unconference
20181210 - PGconf.ASIA Unconference20181210 - PGconf.ASIA Unconference
20181210 - PGconf.ASIA Unconference
 
20181116 Massive Log Processing using I/O optimized PostgreSQL
20181116 Massive Log Processing using I/O optimized PostgreSQL20181116 Massive Log Processing using I/O optimized PostgreSQL
20181116 Massive Log Processing using I/O optimized PostgreSQL
 
20181016_pgconfeu_ssd2gpu_multi
20181016_pgconfeu_ssd2gpu_multi20181016_pgconfeu_ssd2gpu_multi
20181016_pgconfeu_ssd2gpu_multi
 
20181025_pgconfeu_lt_gstorefdw
20181025_pgconfeu_lt_gstorefdw20181025_pgconfeu_lt_gstorefdw
20181025_pgconfeu_lt_gstorefdw
 
20180920_DBTS_PGStrom_EN
20180920_DBTS_PGStrom_EN20180920_DBTS_PGStrom_EN
20180920_DBTS_PGStrom_EN
 

Recently uploaded

新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxAtomu Hidaka
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directoryosamut
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000Shota Ito
 
プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価sugiuralab
 
プレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールプレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールsugiuralab
 

Recently uploaded (7)

新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000
 
プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価
 
プレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールプレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツール
 

20201113_PGconf_Japan_GPU_PostGIS

  • 2. 自己紹介/HeteroDB社について PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平2 会社概要  商号 ヘテロDB株式会社  創業 2017年7月4日  拠点 品川区北品川5-5-15 大崎ブライトコア4F  事業内容 高速データベース製品の販売 GPU&DB領域の技術コンサルティング ヘテロジニアスコンピューティング技術を データベース領域に適用し、 誰もが使いやすく、安価で高速なデータ解析基盤を提供する。 代表者プロフィール  海外 浩平(KaiGai Kohei)  OSS開発者コミュニティにおいて、PostgreSQLやLinux kernelの 開発に10年以上従事。主にセキュリティ・FDW等の分野でアッ プストリームへの貢献。  IPA未踏ソフト事業において“天才プログラマー”認定 (2006)  GPU Technology Conference Japan 2017でInception Awardを受賞
  • 3. PG-Stromとは? PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平3 【機能】  集計/解析ワークロードの透過的なGPU高速化  SSD-to-GPU Direct SQLによるPCIeバスレベルの最適化  Apache Arrow対応によるデータ交換、インポート時間をほぼゼロに  GPUメモリにデータを常駐。OLTPワークロードとの共存  PostGIS関数のサポート(一部)。位置情報分析を高速化 PG-Strom: GPUとNVME/PMEMの能力を最大限に引き出し、 テラバイト級のデータを高速処理するPostgreSQL向け拡張モジュール App GPU off-loading for IoT/Big-Data for ML/Analytics ➢ SSD-to-GPU Direct SQL ➢ Columnar Store (Arrow_Fdw) ➢ GPU Memory Store (Gstore_Fdw) ➢ Asymmetric Partition-wise JOIN/GROUP BY ➢ BRIN-Index Support ➢ NVME-over-Fabric Support ➢ Inter-process Data Frame for Python scripts ➢ Procedural Language for GPU native code (w/ cuPy) ➢ PostGIS Support NEW NEW
  • 4. GPUとはどんなプロセッサなのか? PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平4 主にHPC分野で実績があり、機械学習用途で爆発的に普及 NVIDIA A100 スーパーコンピュータ (東京工業大学 TSUBAME3.0) CG(Computer Graphics) 機械学習 数千コアの並列処理ユニット、TB/sに達する広帯域メモリを ワンチップに実装した半導体デバイス ➔ “同じ計算を大量のデータに並列実行” を最も得意とする シミュレーション
  • 5. ターゲット:移動体デバイスのデータ検索 ▌移動体デバイス  高頻度で位置(緯度、経度)の更新がかかる。  (デバイスID、タイムスタンプ、位置、その他の属性)というデータ構造が多い ▌エリア定義情報  比較的件数は少なく、ほぼ静的なデータだが、エリア定義情報(多角形)が 非常に複雑な構造を持ち、当たり判定が“重い” ▌用途  商圏分析、物流分析、広告配信、アラート通知、etc… 位置情報 (緯度、経度) エリア定義情報 (ポリゴン) 移動体デバイス エリア内に存在する 移動体デバイスの抽出 PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平5
  • 6. GPU版PostGISについて PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平6
  • 7. PostGISって?(1/2) ▌概要  点(Point)、線(LineString)、多角形(Polygon)等のジオメトリ要素、 およびそれらの間の演算を PostgreSQL で実行するための拡張モジュール  演算の例 … 包含(Contains)、交差(Crosses)、接合(Touch)など  GiSTインデックスに対応して高速な検索を実現  2005年に PostGIS 1.0 がリリース。以降、15年にわたって継続的開発。 ▌PostGIS関数・演算子の例  st_distance(geometry g1, geometry g2) ✓ ジオメトリ間の距離を計算する  st_contains(geometry g1, geometry g2) ✓ ジオメトリ g2 が g1 に包含されていれば真  st_crosses(geometry g1, geometry g2) ✓ ジオメトリ g2 が g1 を横切っていれば真 …など © GAIA RESOURCES PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平7
  • 8. PostGISって?(2/2) PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平8 St_Distance(a,b) ジオメトリ間の距離 St_Crosses(a,b) ジオメトリの交差判定 St_Contains(a,b) ジオメトリの包含判定
  • 9. 高速化手法(1/2)- Bounding Box PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平9 ▌Bounding Boxとは  複雑な形状のポリゴンを包摂する最も小さな矩形領域  (x1,y1) - (x2,y2) で表現できるのでデータ量が少ない  PostgreSQL / PostGISが geometry 型を保存する時に自動的に生成される。 ▌Bounding Boxの効果  空間関係演算を行う前に、『明らかに接していない』ものを識別できる。 ➔ 重なりを含むジオメトリのみ判定を行う事で、計算リソースを節約。 明らかに接していない 共通部分を持つ可能性
  • 10. 高速化手法(2/2)- GiSTインデックス PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平10 ▌GiSTインデックスとは  PostgreSQLのGiST(Generalized Search Tree)は、ツリー構造を持つ インデックスを一般化したフレームワーク。  PostGISのGeometry型は、GiST上にR木を実装している。 ▌GiSTのR木でできること  包含(@演算子)や重なり(&&演算子)判定で、インデックスを用いた絞込み  特に多数のポリゴン×ポイントの重なり判定で計算量が増大しやすい ➔ 事前の絞り込みで計算量を抑え込む # 国土地理院の市町村形状データをインポート $ shp2pgsql N03-20_200101.shp | psql gistest gistest=# ¥d+ List of relations Schema | Name | Type | Owner | Size | --------+-------------+----------+--------+------------+ public | geo_japan | table | kaigai | 243 MB | gistest=# ¥di+ List of relations Schema | Name | Type | Owner | Table | Size | --------+--------------------+-------+--------+-----------+---------+ public | geo_japan_pkey | index | kaigai | geo_japan | 2616 kB | public | geo_japan_geom_idx | index | kaigai | geo_japan | 14 MB |
  • 11. なぜGPUでSQLを高速化できるのか? PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平11 ▌GPUの特徴  数千演算コアを搭載する計算能力  1.0TB/sに迫るメモリバンド ➔ 「同じ演算を多量のデータに対して実行する」ために作られたプロセッサ (e.g 行列演算) ▌SQLワークロードの特性  「同じ処理を大量の行に対して実行する」 (例:WHERE句の評価、JOINやGROUP BY処理) SQL処理の中でも、全件スキャンを伴うようなワークロードに強い GPUに実装された数千コアの 実行ユニットが、個々の行を 並列に評価する。
  • 12. GPUでPostGIS関数を実行する(1/2) postgres=# ¥d _gistest Table "public._gistest" Column | Type | Collation | Nullable | Default --------+----------+-----------+----------+-------------------------------------- id | integer | | not null | nextval('_gistest_id_seq'::regclass) a | geometry | | | b | geometry | | | postgres=# explain verbose select * from _gistest where st_contains(a,b); QUERY PLAN ------------------------------------------------------------------------------------ Custom Scan (GpuScan) on public._gistest (cost=4251.50..4251.50 rows=1 width=196) Output: id, a, b GPU Filter: st_contains(_gistest.a, _gistest.b) GPU Preference: None Kernel Source: /var/lib/pgdata/pgsql_tmp/pgsql_tmp_strom_21028.4.gpu Kernel Binary: /var/lib/pgdata/pgsql_tmp/pgsql_tmp_strom_21028.5.ptx (6 rows) PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平12
  • 13. GPUでPostGIS関数を実行する(2/2) $ less /var/lib/pgdata/pgsql_tmp/pgsql_tmp_strom_21028.4.gpu : #include "cuda_postgis.h" #include "cuda_gpuscan.h" DEVICE_FUNCTION(cl_bool) gpuscan_quals_eval(kern_context *kcxt, kern_data_store *kds, ItemPointerData *t_self, HeapTupleHeaderData *htup) { void *addr __attribute__((unused)); pg_geometry_t KVAR_2; pg_geometry_t KVAR_3; assert(htup != NULL); EXTRACT_HEAP_TUPLE_BEGIN(addr, kds, htup); EXTRACT_HEAP_TUPLE_NEXT(addr); pg_datum_ref(kcxt,KVAR_2,addr); // pg_geometry_t EXTRACT_HEAP_TUPLE_NEXT(addr); pg_datum_ref(kcxt,KVAR_3,addr); // pg_geometry_t EXTRACT_HEAP_TUPLE_END(); return EVAL(pgfn_st_contains(kcxt, KVAR_2, KVAR_3)); } : PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平13 列A、列Bから ジオメトリ型の データをロード ロードしたデータで GPU版 st_contains() 関数を 呼出し SQLのWHERE句を 評価するために 自動生成された関数
  • 14. 検索処理のパフォーマンス(1/2) --- GpuScan (GPU版PostGIS) + Gstore_Fdw =# SELECT count(*) FROM ft WHERE st_contains('polygon ((10 10,90 10,90 12,12 12,12 88,90 88,90 90,¥ 10 90,10 10))’, st_makepoint(x,y)); count ------- 94440 (1 row) Time: 75.466 ms --- 通常版PostGIS + PostgreSQLテーブル =# SET pg_strom.enabled = off; SET =# SELECT count(*) FROM tt WHERE st_contains('polygon ((10 10,90 10,90 12,12 12,12 88,90 88,90 90,¥ 10 90,10 10))', st_makepoint(x,y)); count ------- 94440 (1 row) Time: 332.300 ms 200万個のPointから、 指定領域内の数をカウント PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平14
  • 15. 検索処理のパフォーマンス(2/2) PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平15 (100,100) (0,0) (90,90) (90,10) (90,12)(12,12) (12,88) (90,88) (10,90) (10,10) この領域内に含まれる 点(Point)を抽出した テーブル ft および tt には (0,0)~(100,100)の範囲内に ランダムに 200万個の点を格納
  • 16. ポリゴン × 座標の突合 ▌ナイーブなポリゴン×座標の突合を行おうとすると、 数万×数千万 = 数兆通りの組合せ、で計算量が爆発。 ➔ GPUが数千コアを搭載していても、 計算量が多すぎて焼け石に水。 位置情報 (緯度、経度) エリア定義情報 (ポリゴン) 移動体デバイス 数百万~数千万件数百~数万件 焼け石(GPU)に ➔ 水冷モジュール PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平16
  • 17. GPUでGiSTインデックス PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平17
  • 18. GiSTインデックス(R木)の仕組み ▌GiSTインデックス(R木)の仕組み ✓ R1は(R3,R4,R5)を全て包含する矩形領域の(Xmin,Ymin) – (Xmax,Ymax)と、下位ノードへのポインタ ✓ R4は(R11,R12)を全て包含する矩形領域の(Xmin,Ymin) – (Xmax,Ymax)と、下位ノードへのポインタ ✓ R12は対象ジオメトリを包含する矩形領域の(Xmin,Ymin) – (Xmax,Ymax)と ItemPointer を含む。 ✓ 各ノード(BLCKSZ)内のエントリを順に評価。マッチしたものを次の階層へすすめる。 ✓ 階層ごとに繰り返し評価が発生するので、B-tree並みに速くはできない。 (xmin,ymin) (xmax,ymax) PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平18 検索キー(経度, 緯度) 〇 〇
  • 19. GiSTインデックス(R木)の仕組み ▌GiSTインデックス(R木)の仕組み ✓ R1は(R3,R4,R5)を全て包含する矩形領域の(Xmin,Ymin) – (Xmax,Ymax)と、下位ノードへのポインタ ✓ R4は(R11,R12)を全て包含する矩形領域の(Xmin,Ymin) – (Xmax,Ymax)と、下位ノードへのポインタ ✓ R12は対象ジオメトリを包含する矩形領域の(Xmin,Ymin) – (Xmax,Ymax)と ItemPointer を含む。 ✓ 各ノード(BLCKSZ)内のエントリを順に評価。マッチしたものを次の階層へすすめる。 ✓ 階層ごとに繰り返し評価が発生するので、B-tree並みに速くはできない。 (xmin,ymin) (xmax,ymax) PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平19 検索キー(経度, 緯度) 〇 〇 × 〇 ×
  • 20. GiSTインデックス(R木)の仕組み ▌GiSTインデックス(R木)の仕組み ✓ R1は(R3,R4,R5)を全て包含する矩形領域の(Xmin,Ymin) – (Xmax,Ymax)と、下位ノードへのポインタ ✓ R4は(R11,R12)を全て包含する矩形領域の(Xmin,Ymin) – (Xmax,Ymax)と、下位ノードへのポインタ ✓ R12は対象ジオメトリを包含する矩形領域の(Xmin,Ymin) – (Xmax,Ymax)と ItemPointer を含む。 ✓ 各ノード(BLCKSZ)内のエントリを順に評価。マッチしたものを次の階層へすすめる。 ✓ 階層ごとに繰り返し評価が発生するので、B-tree並みに速くはできない。 (xmin,ymin) (xmax,ymax) PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平20 検索キー(経度, 緯度) 〇 〇 × 〇 × 〇×
  • 21. GiSTインデックス(R木)の仕組み ▌GiSTインデックス(R木)の仕組み ✓ R1は(R3,R4,R5)を全て包含する矩形領域の(Xmin,Ymin) – (Xmax,Ymax)と、下位ノードへのポインタ ✓ R4は(R11,R12)を全て包含する矩形領域の(Xmin,Ymin) – (Xmax,Ymax)と、下位ノードへのポインタ ✓ R12は対象ジオメトリを包含する矩形領域の(Xmin,Ymin) – (Xmax,Ymax)と ItemPointer を含む。 ✓ 各ノード(BLCKSZ)内のエントリを順に評価。マッチしたものを次の階層へすすめる。 ✓ 階層ごとに繰り返し評価が発生するので、B-tree並みに速くはできない。 (xmin,ymin) (xmax,ymax) PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平21 検索キー(経度, 緯度) 〇 〇 × 〇 × 〇× × ×
  • 22. GPU版GiSTインデックス PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平22 ▌仕組み  多角形(エリア定義情報)を保持するテーブルと、位置情報(緯度経度)を 保持するテーブルとの JOIN にGiSTインデックスを使用できる。  JOIN処理時、テーブルとインデックスの双方をGPUにロード。 先ずGiSTインデックス上のBounding-Box(矩形領域)を使って荒く絞り込み、 次にテーブル上の多角形(ポリゴン)と「当たり判定」を行う。  GPUの数千コアをフル稼働してGiSTインデックスを探索する。 単純に並列度が高い分、検索速度も速くなるはず。 ➔ が、そうは問屋が卸さなかった。。。 多角形 × 点の重なり判定などを、GpuJoinの一要素として実装 GiST(R木)インデックス ポリゴン定義 位置データを含む テーブル 数千スレッドが 並列に インデックスを 探索
  • 23. 簡易テスト:ランダムな点とSt_Contains(9月末ごろ) PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平23 (123.0, 20.0) (154.2, 46.2) SELECT n03_001,n03_004,count(*) FROM geo_japan j, geopoint p WHERE st_contains(j.geom, st_makepoint(x,y)) AND j.n03_001 like '東京都’ GROUP BY n03_001,n03_004; ランダムに 生成した座標 1000万個 n03_001 | n03_004 | count ---------+------------+------- 東京都 | あきる野市 | 105 東京都 | 三宅村 | 76 東京都 | 三鷹市 | 17 東京都 | 世田谷区 | 67 東京都 | 中央区 | 12 東京都 | 中野区 | 18 東京都 | 八丈町 | 105 : : : 東京都 | 豊島区 | 14 東京都 | 足立区 | 55 東京都 | 青ヶ島村 | 7 東京都 | 青梅市 | 117 (63 rows) CPU版:24.892s GPU版:33.841s(遅い!) 国土地理院からDLした 全国市町村形状データ
  • 24. 前提)GPUスレッドのスケジューリングについて PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平24  GPUはStreaming Multiprocessor(SM)と呼ばれる単位でコアがグループ化されている。 ✓ レジスタやL1キャッシュ(共有メモリ)はSM単位のリソース  同じSM上で実行されるスレッドの組を Thread Group と呼び、リソースが許せば 最大で 1024 スレッドまで並行で実行する事ができる。 ✓ スレッドの切り替えはH/W的に実現され、例えばDRAMアクセス待ちのタイミングで切り替わったり。  スレッドはWarp (32threads) 単位でスケジューリングされる。同一Warp内のス レッドは、同時には同じ命令しか実行できない。 ✓ 行列計算のように、各コアの負荷が均等になるタイプの処理であればGPUの使用効率は最大化。 ✓ スレッド毎に処理時間がバラバラだと、一部のコアが遊んでしまい、処理効率の低下を招く。 GPU Block Diagram (Tesla V100; 80SMs) Streaming Multiprocessors (64CURE cores/SM) ●●●…●●● ●●●…●●● ●●●…●●● ●●●…●●● ●●●…●●● ●●●…●●● Thread Group (1~1024 Threads) Warp (32 threads)
  • 25. 前提)GpuJoinの並列処理デザイン PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平25 SELECT * FROM A, B WHERE A.id = B.id; Table-A 512スレッドが 512行を一度に 取り出し Table-B ● ● ● ● ● ● 〇 × 〇 × 〇 × GpuHashJoin / GpuNestLoop 処理 N = __syncthreads_count(...) JOIN結果の書き出し atomic演算を用いて、thread_id=0が 結果バッファにN個分の領域を確保 次のフレームを 取り出して、 以降繰り返し GpuHashJoin処理 • Hash値の計算 • Hash表の探索 • JOIN条件の評価 GpuNestLoop処理 • JOIN条件の評価 ➔スレッド間で大きな 処理時間の差が つきにくい。 参照
  • 26. GPUでのインデックス探索の課題 PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平26 スレッド間の処理時間の差が大きく、同期待ちを招く Table-A ● ● ● ● ● ● 参照 Index-A × × × × × 〇 N = __syncthreads_count(...) 参照 R木のLeafノード まで探索したが ヒットせず R木のRootノードを 見ただけで、即、 マッチする要素なし R木を最後まで 探索し、かつ、 JOINの結合条件を評価 スレッドグループに属する 他のスレッドの完了待ちで GPUコアが遊んでしまう。
  • 27. ナイーブなGPU版GiSTインデックス実装(9月末) PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平27 GPUの利用効率が上がらず、しばしばCPUより低速だった ● ● ● ● ● ● ●● 各スレッドが1行分のデータをロード GiST-Index探索用のキー値を抽出する。 GiST-Indexにヒットした? キー値を用いてGiST-Indexを探索する JOIN結合条件は真? JOIN結合条件を評価する nitems個分のJOIN結果を書き出し nitems = __syncthreads_count(found); 繰り返し found=true found=false No No スレッドグループ(512スレッド)内に、 1個でもGiST-IndexのLeafまで降下して 探索したり、JOIN結合条件の評価まで 行うスレッドがいると、他の511スレッ ドはその完了を待たされてしまう。 結果として、GPUコアの使用率が全く 向上しないという事になる。
  • 28. GPUのスレッドスケジューリングを意識した実装(11月頭) PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平28 できる限りコアが遊ばないよう、同期ポイントを最小化 ● ● ● ● ● ● ●● 各Warp(32スレッド)毎に1行分のデータをロード GiST-Index探索用のキー値を抽出する。 キー値を用いてGiST-Indexを探索する GiST-Indexにヒットした? Atomic演算を用いて中間バッファの領域を確保 GiST-Indexにヒットした行のポインタを記録 中間バッファの使用量が 512個を越えた __syncthreads() 中間バッファを元に、JOIN結合条件を評価する JOIN結合条件は真? No No nitems = __syncthreads_count(found) nitems個分のJOIN結果を書き出し 繰り返し found=false found=true 中間バッファの使用量に余裕がある限り、 同期ポイントに達する前にどんどん Readポインタを進めて GiST-Index の 探索を進める。 ➔ 一部のWarp(スレッド)で探索に 時間を要しても、他のWarpは先に 次の行を処理できるため、 GPUコアの使用率を高くできる。
  • 29. 簡易テスト:ランダムな点とSt_Contains(最新版) PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平29 (123.0, 20.0) (154.2, 46.2) SELECT n03_001,n03_004,count(*) FROM geo_japan j, geopoint p WHERE st_contains(j.geom, st_makepoint(x,y)) AND j.n03_001 like '東京都’ GROUP BY n03_001,n03_004; ランダムに 生成した座標 1000万個 n03_001 | n03_004 | count ---------+------------+------- 東京都 | あきる野市 | 105 東京都 | 三宅村 | 76 東京都 | 三鷹市 | 17 東京都 | 世田谷区 | 67 東京都 | 中央区 | 12 東京都 | 中野区 | 18 東京都 | 八丈町 | 105 : : : 東京都 | 豊島区 | 14 東京都 | 足立区 | 55 東京都 | 青ヶ島村 | 7 東京都 | 青梅市 | 117 (63 rows) CPU版:24.892s GPU版: 3.733s 国土地理院からDLした 全国市町村形状データ 6倍強の 高速化
  • 30. 簡易テストの実行計画(CPU版) PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平30 postgres=# EXPLAIN (analyze, costs off) SELECT n03_001,n03_004,count(*) FROM geo_japan j, geopoint p WHERE st_contains(j.geom, st_makepoint(x,y)) AND j.n03_001 like '東京都’ GROUP BY n03_001,n03_004; QUERY PLAN ---------------------------------------------------------------------------------------- Finalize GroupAggregate (actual time=24880.443..24880.682 rows=63 loops=1) Group Key: j.n03_001, j.n03_004 -> Gather Merge (actual time=24880.430..24892.342 rows=299 loops=1) Workers Planned: 4 Workers Launched: 4 -> Partial GroupAggregate (actual time=24855.860..24855.949 rows=60 loops=5) Group Key: j.n03_001, j.n03_004 -> Sort (actual time=24855.846..24855.865 rows=529 loops=5) Sort Key: j.n03_001, j.n03_004 Sort Method: quicksort Memory: 64kB -> Nested Loop (actual time=50.124..24854.788 rows=529 loops=5) -> Parallel Seq Scan on geopoint p (actual time=0.120..258.900 rows=2000000 loops=5) -> Index Scan using geo_japan_geom_idx on geo_japan j (actual time=0.012..0.012 rows=0 loops=10000000) Index Cond: (geom ~ st_makepoint(p.x, p.y)) Filter: (((n03_001)::text ~~ '東京都'::text) AND st_contains(geom, st_makepoint(p.x, p.y))) Rows Removed by Filter: 0 Planning Time: 0.160 ms Execution Time: 24892.586 ms (22 rows)
  • 31. 簡易テストの実行計画(GPU版) PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平31 postgres=# EXPLAIN (analyze, costs off) SELECT n03_001,n03_004,count(*) FROM geo_japan j, fgeopoint p WHERE st_contains(j.geom, st_makepoint(x,y)) AND j.n03_001 like '東京都’ GROUP BY n03_001,n03_004; QUERY PLAN ----------------------------------------------------------------------------------------------- HashAggregate (actual time=3725.900..3725.938 rows=63 loops=1) Group Key: j.n03_001, j.n03_004 -> Custom Scan (GpuJoin) on fgeopoint p (actual time=3725.169..3725.415 rows=2646 loops=1) Outer Scan: fgeopoint p (never executed) Depth 1: GpuGiSTJoin HeapSize: 7841.91KB (estimated: 3113.70KB), IndexSize: 13.28MB IndexFilter: (j.geom ~ st_makepoint(p.x, p.y)) on geo_japan_geom_idx Rows Fetched by Index: 5065 JoinQuals: st_contains(j.geom, st_makepoint(p.x, p.y)) GPU Preference: GPU0 (Tesla V100-PCIE-16GB) -> Seq Scan on geo_japan j (actual time=0.154..17.959 rows=6173 loops=1) Filter: ((n03_001)::text ~~ '東京都'::text) Rows Removed by Filter: 112726 Planning Time: 0.297 ms Execution Time: 3733.403 ms (15 rows)
  • 32. GPU版に固有の最適化 PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平32 ▌ PostgreSQLの場合、Indexに付随する条件句の評価は、Indexを用いて候補となる行を取り出し た後にしか行えない。つまり、結果的に無駄となる行フェッチが発生する。 ▌ GPU版GiSTインデックスでは、予め「明らかに条件に該当しないエントリ」のLeaf要素を無効 化するため、何度も何度も自明な条件句の評価を行う必要はない。 ➔ 『1週間分のデータから直近30分のイベントだけを取り出す』といった特性がある場合に、 通常のGiSTインデックス探索よりも有利に働く。 GiST Rootブロック IndexTupleData IndexTupleData IndexTupleData IndexTupleData IndexTupleData IndexTupleData IndexTupleData notinuse EXPLAIN SELECT n03_001,n03_004,count(*) FROM geo_japan j, geopoint p WHERE st_contains(j.geom, st_makepoint(x,y)) AND j.n03_001 like '東京都’ GROUP BY n03_001,n03_004; QUERY PLAN ------------------------------------------------------ GroupAggregate Group Key: j.n03_001, j.n03_004 -> Sort Sort Key: j.n03_001, j.n03_004 -> Nested Loop -> Seq Scan on geopoint p -> Index Scan using geo_japan_geom_idx on geo_japan j Index Cond: (geom ~ st_makepoint(p.x, p.y)) Filter: (((n03_001)::text ~~ '東京都') AND st_contains(geom, st_makepoint(p.x, p.y))) (9 rows)あらかじめ、明らかに条件に該当しないエントリ (この場合は ‘東京都’ 以外)を無効化
  • 33. 小噺)ちょっと感動した話 postgres=# EXPLAIN SELECT n03_001,n03_004,count(*) FROM geo_japan j, geopoint p WHERE st_dwithin(j.geom, st_makepoint(x,y), 0.004) AND j.n03_001 like '東京都’ GROUP BY n03_001,n03_004; QUERY PLAN ----------------------------------------------------------------------------------------------------- HashAggregate (cost=1936845.15..1936893.73 rows=4858 width=29) Group Key: j.n03_001, j.n03_004 -> Custom Scan (GpuJoin) on geopoint p (cost=159401.97..1480539.90 rows=60840700 width=21) Outer Scan: geopoint p (cost=0.00..163696.15 rows=10000115 width=16) Depth 1: GpuGiSTJoin(nrows 10000115...60840700) HeapSize: 3113.70KB IndexFilter: (j.geom && st_expand(st_makepoint(p.x, p.y), '0.004'::double precision)) on geo_japan_geom_idx JoinQuals: st_dwithin(j.geom, st_makepoint(p.x, p.y), '0.004'::double precision) GPU Preference: GPU0 (Tesla V100-PCIE-16GB) -> Seq Scan on geo_japan j (cost=0.00..8928.24 rows=6084 width=1868) Filter: ((n03_001)::text ~~ '東京都'::text) (11 rows) PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平33 st_makepoint(p.x, p.y) st_expand() ✓ 引数1(点)を上下左右に引数2(実数)だけ拡張 した矩形領域を返す。 ➔ これとGiSTインデックスのBounding-Boxが 共通領域を持てば、st_dwithin()が真となる 可能性がある。 0.004 0.004
  • 35. IoT/M2MデータのライフサイクルとPG-Stromの機能 時系列データ (数TB~) 前処理済みデータ リアルタイムデータ ETL・ 前処理 課題: 大容量データの保存・読出し 課題: 高頻度な更新と高速な解析処理の両立 Apache Arrow対応 (Arrow_Fdw) SSD-to-GPU Direct SQL BRIN-Index GPU Memory Store (Gstore_Fdw) RuntimeGPUCodeGeneration PostGIS/JSONdatasupport NEWNEW PG-Strom機能群 データ量:大 データ量:小 従来のスコープ PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平35
  • 36. 背景と課題 ▌GPUとホストメモリは“遠い”  通常、GPUはPCI-Eバスを介してホストシステムと接続する。  PCI-E Gen 3.0 x16レーンだと、片方向 16GB/s 「しかない」 行って帰ってのレイテンシは数十マイクロ秒単位。  DRAMの転送速度は140GB/sでレイテンシは100ns程度。 もしL1/L2に載っていれば数ns単位でアクセス可能 出展:https://gist.github.com/eshelman/343a1c46cb3fba142c1afdcdeec17646 ▌高い更新頻度  もし100万デバイスが10秒に一度、 現在位置を更新するなら? ➔ 単純 UPDATE を毎秒10万回実行。 ➔ 1.0sec / 10万 = 10us ▌リアルタイム性に対する要請  利用者が検索、解析したいのは、 「その時点での最新の状態」 ➔ 後でまとめてバッチ、では通用しない。 GPU Device RAM RAMCPU 900GB/s 140GB/s 16GB/s PCI-E Gen3.0 PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平36
  • 37. Gstore_Fdwアーキテクチャ REDOログを利用してGPUメモリ側を非同期に更新する。 検索クエリの実行前に更新を適用すれば辻褄は合う! Host Memory Store REDO Log Buffer Base File Redo File Host Memory Storage GPU Device Memory Store PostgreSQL Backend (OLTP系) PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平37 PostgreSQL Backend (OLTP系) PostgreSQL Backend (OLTP系) INSERT UPDATE DELETE ログ追記 更新系処理では 一切GPUにタッチしない
  • 38. Gstore_Fdwアーキテクチャ REDOログを利用してGPUメモリ側を非同期に更新する。 検索クエリの実行前に更新を適用すれば辻褄は合う! Host Memory Store REDO Log Buffer Base File Redo File Host Memory Storage GPU Device Memory Store PostgreSQL BG-Worker (GPUバッファ管理) PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平38 ①未適用分のログ転送 GPU Kernel to apply REDO Log 数千スレッドで動作 ほぼ一瞬で適用できる ②GPUカーネルの起動
  • 39. Gstore_Fdwアーキテクチャ REDOログを利用してGPUメモリ側を非同期に更新する。 検索クエリの実行前に更新を適用すれば辻褄は合う! Host Memory Store REDO Log Buffer Base File Redo File Host Memory Storage GPU Device Memory Store PostgreSQL Backend (解析系SQL) PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平39 ①未適用分のログ転送 GPU Kernel to apply REDO Log SQL処理の前に REDO ログを 適用すれば、辻褄はあう (一貫性が保たれる) GPU Kernel to execute SQL ②GPUカーネルの起動
  • 40. Gstore_Fdw外部テーブルの定義 CREATE FOREIGN TABLE ft ( id int, x float, y float, z text ) server gstore_fdw options (gpu_device_id '1', base_file '/opt/pgdata-dev/ft.base', redo_log_file '/opt/pmem-dev/ft.redo’, max_num_rows '4000000', primary_key 'id'); (補足)  base_fileはNVMEストレージ上に配置するのが望ましい。 ✓ mmap(2)してバイト単位のランダムアクセスが多発するため、 PMEMの微妙なアクセスの遅さが性能差として見えてしまう。  redo_log_fileはPMEM上に配置するのが望ましい。 ✓ トランザクションのコミット時にREDOログを永続化する必要があるため。 追記書き出しのみだが、細かい単位でCPUキャッシュをフラッシュする。 (逆にブロックデバイスのようなfsyncは必要ないが) PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平40
  • 41. 更新処理のパフォーマンス(1/2) --- 200万行を投入 INSERT INTO ft (SELECT x, 100*random(), 100*random(), md5(x::text) FROM generate_series(1,2000000) x); --- 座標に見立てたx,yをランダムな値で更新 --- (pgbenchでクライアント数:20を想定) UPDATE ft SET x = 100*random(), y = 100*random() WHERE id = (SELECT 20*(100000.0*random())::int + :client_id); --- 実行計画 EXPLAIN ....; QUERY PLAN ------------------------------------------------------------------- Update on ft (cost=0.02..100.03 rows=10000 width=58) InitPlan 1 (returns $0) -> Result (cost=0.00..0.02 rows=1 width=4) -> Foreign Scan on ft (cost=0.00..100.01 rows=10000 width=58) Filter: (id = $0) Index Cond: id = $0 (6 rows) PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平41
  • 42. 更新処理のパフォーマンス(2/2) $ pgbench -p 6543 postgres -n -f test.sql -c 20 -j 10 -T 10 transaction type: test.sql scaling factor: 1 query mode: simple number of clients: 20 number of threads: 10 duration: 10 s number of transactions actually processed: 1236401 latency average = 0.162 ms tps = 123631.393482 (including connections establishing) tps = 123674.819689 (excluding connections establishing) (補足)  まだ排他ロックで実装している箇所があり、クライアント数が20を越えた辺りで サチり始める。 ➔ Atomic演算による置き換えや、マルチGPU化による排他ロック自身の分散。  PostgreSQLの通常テーブル(on NVME-SSD): 20クライアント 65k TPS、80クライアント160k TPS程度  通常テーブルと外部テーブルの内部ロジックの違いに起因する差異は未検証 PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平42
  • 43. 検索処理のパフォーマンス(再掲) --- GpuScan (GPU版PostGIS) + Gstore_Fdw =# SELECT count(*) FROM ft WHERE st_contains('polygon ((10 10,90 10,90 12,12 12,12 88,90 88,90 90,¥ 10 90,10 10))’, st_makepoint(x,y)); count ------- 94440 (1 row) Time: 75.466 ms --- 通常版PostGIS + PostgreSQLテーブル =# SET pg_strom.enabled = off; SET =# SELECT count(*) FROM tt WHERE st_contains('polygon ((10 10,90 10,90 12,12 12,12 88,90 88,90 90,¥ 10 90,10 10))', st_makepoint(x,y)); count ------- 94440 (1 row) Time: 332.300 ms 200万個のPointから、 指定領域内の数をカウント PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平43
  • 44. Gstore_Fdw機能の今後 PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平44 モデル名 p3.2xlarge p3.8xlarge p3.16xlarge NC6s v NC12s v3 NC24s v3 vCPU 8 core 32 core 64 core 6 core 12 core 24 core RAM 61GB 244GB 488GB 112 GB 224 GB 448 GB GPU 1 x Tesla V100 (16GB; 5120C) 4 x Tesla V100 (16GB; 5120C) 8 x Tesla V100 (16GB; 5120C) 1 x Tesla V100 (16GB; 5120C) 2 x Tesla V100 (16GB; 5120C) 4 x Tesla V100 (16GB; 5120C) オンデマンド 料金 4.194USD/h 16.776USD/h 32.552USD/h ¥469.73/h ¥939.46/h ¥2066.85/h ※ オンデマンド料金は、各社東京リージョンの本体のみ単価(2020/11/11現在)で記載。 ▌機能強化  マルチGPU(マルチバッファ)への対応 ✓ GPUバッファ容量の拡大と、分析時に複数台のGPUへ負荷を割り振る効果。 ✓ 更新時の排他ロックを分散させる効果。  継続的なソフトウェア品質改善 ▌クラウド提供  従来のNVME-GPU連携フォーカスと異なり、 GPUのみでシステムを構成できるためハードウェア要件が緩い。 WIP
  • 45. PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平45 GPU版PostGIS(GiSTインデックス)を用いた 実ワークロードの性能評価
  • 47. 検索における工夫 PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平47 近傍に位置する駅は両方訪問した事にする。 大阪梅田 東京メトロ銀座線京橋駅と、 都営浅草線京橋駅 西武鉄道 西武秩父駅と、 秩父鉄道 御花畑駅 JR武蔵野線 北朝霞駅と、 東武東上線 朝霞台駅
  • 48. 集計クエリの構造 PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平48 TRUNCATE train_visit_summary; INSERT INTO train_visit_summary ( -- 集計結果を集計テーブルに保持しておき、Web画面の表示時に -- 未訪問の都道府県も含めて出力する。 WITH cte_station_visit AS ( SELECT DISTINCT s.pref_cd, s.station_cd, u.uid -- “訪問”した駅コード、その都道府県コード、ユーザIDを -- 重複なしで取り出す FROM train_station_list s, train_user_station u -- 駅の位置と、ユーザのチェックイン情報を突合する WHERE st_dwithin(st_makepoint(s.lon, s.lat), st_makepoint(u.lon, u.lat), 0.004) -- 駅の位置とユーザのチェックイン情報の位置が一定範囲内に存在すれば、 -- その駅を訪問したものとみなす。 AND s.station_cd = s.station_g_cd ) SELECT v.pref_cd, v.uid, count(*) INTO train_visit_summary FROM cte_station_visit v GROUP BY 1, 2 ); (ユーザ, 都道府県)ごとに、訪問した駅の数を集計
  • 49. 実行結果(CPU) PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平49 QUERY PLAN ------------------------------------------------------------------------------------------ Insert on train_visit_summary (actual time=564337.937..564337.937 rows=0 loops=1) -> Subquery Scan on "*SELECT*" (actual time=561347.255..564263.657 rows=222985 loops=1) -> GroupAggregate (actual time=561347.253..564245.853 rows=222985 loops=1) Group Key: v.pref_cd, v.uid -> Sort (actual time=561347.227..562318.377 rows=18041063 loops=1) Sort Key: v.pref_cd, v.uid Sort Method: quicksort Memory: 1632107kB -> Subquery Scan on v (actual time=534684.752..543837.130 rows=18041063 loops=1) -> Group (actual time=534684.748..542789.954 rows=18041063 loops=1) Group Key: s.pref_cd, s.station_cd, u.uid -> Sort (actual time=534684.737..538315.419 rows=31188357 loops=1) Sort Key: s.pref_cd, s.station_cd, u.uid Sort Method: quicksort Memory: 2248387kB -> Nested Loop (actual time=0.072..485222.366 rows=31188357 loops=1) -> Seq Scan on train_user_station u (actual time=0.010..2436.186 rows=23969240 loops=1) -> Index Scan using train_station_list_st_makepoint_idx on train_station_list s (actual time=0.018..0.019 rows=1 loops=23969240) Index Cond: (st_makepoint(lon, lat) && st_expand(st_makepoint(u.lon, u.lat), 0.004)) Filter: ((station_cd = station_g_cd) AND st_dwithin(st_makepoint(lon, lat), st_makepoint(u.lon, u.lat), 0.004)) Rows Removed by Filter: 1 Planning Time: 0.241 ms Execution Time: 564369.525 ms (21 rows)
  • 50. 実行結果(GPU) PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平50 QUERY PLAN ------------------------------------------------------------------------------------------ Insert on train_visit_summary (actual time=29994.448..29994.448 rows=0 loops=1) -> Subquery Scan on "*SELECT*" (actual time=29873.410..29925.354 rows=222985 loops=1) -> HashAggregate (actual time=29873.407..29911.557 rows=222985 loops=1) Group Key: s.pref_cd, u.uid -> HashAggregate (actual time=22546.625..26156.456 rows=18041063 loops=1) Group Key: s.pref_cd, s.station_cd, u.uid -> Custom Scan (GpuJoin) on train_user_station u (actual time=614.179..14651.453 rows=31188357 loops=1) Outer Scan: train_user_station u (actual time=49.108..2245.314 rows=23969240 loops=1) Depth 1: GpuGiSTJoin HeapSize: 992.73KB (estimated: 13.12KB), IndexSize: 928.62KB IndexFilter: (st_makepoint(s.lon, s.lat) && st_expand(st_makepoint(u.lon, u.lat), 0.004)) on train_station_list_st_makepoint_idx Rows Fetched by Index: 33137684 JoinQuals: st_dwithin(st_makepoint(s.lon, s.lat), st_makepoint(u.lon, u.lat), 0.004) GPU Preference: GPU0 (Tesla V100-PCIE-16GB) -> Seq Scan on train_station_list s (actual time=0.020..2.591 rows=12542 loops=1) Filter: (station_cd = station_g_cd) Rows Removed by Filter: 2534 Planning Time: 0.513 ms Execution Time: 30087.473 ms (19 rows)
  • 51. まとめ(1/2) PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平51 ▌GPU版PostGIS  PostGIS関数をGPU上で並列実行するための機能拡張。  GiSTインデックスにも対応し、H/Wの特性を活かしたインデックス探索を実装。 ▌GPUメモリストア  リアルタイムのデータ更新と分析ワークロードを両立するための機能。  GPUにデータを常駐させ、PMEMを利用してトランザクションを永続化。 ▌想定用途  携帯電話や自動車の“位置情報“と、エリア定義情報との突合。  リアルタイムの広告配信やプッシュ型イベント通知など。  これら位置情報分析を含む “計算ヘビー“ なワークロードを 手元のワークステーションやクラウドで手軽に実行できるように。 ▌リソース  GitHub: https://github.com/heterodb/pg-strom  Document: http://heterodb.github.io/pg-strom/ja/  Contact: Tw: @kkaigai / ✉ kaigai@heterodb.com
  • 52. まとめ(2/2) PostgreSQL Conference Japan 2020 - GPUが拓く地理情報分析の新たな地平52 ▌リソース  GitHub: https://github.com/heterodb/pg-strom  Document: http://heterodb.github.io/pg-strom/ja/  Contact: Tw: @kkaigai / ✉ kaigai@heterodb.com PG-Stromプロジェクトは皆さんのご参加を歓迎します THANK YOU!