CUDA 8.0 : nvGRAPHの概要と プログラミング

CUDA 8.0 : nvGRAPHの概要と
プログラミング
2016-1014
16:20-16:45
1F ペガサスA
επιστημη
NVIDIA CUDA Ambassador, Microsoft MVP for Visual Studio & Development Technologies
世の中はグラフで溢れている
• 鉄道網・道路網
• 通信網
• Social Network
• Web
• …etc.
2
用語
Vertex : 頂点
weight(重み)
0.3
0
destination(出口)
Edge : 辺
4
source(出口)
Edge = (source, destination)
Topology = Edge の集合
Graph = 重みつきのTopology
※ nvGRAPH では:
• Edge は重複しない
• weight > 0
3
Graph = Topology + 重み
0
0
0.3
4
0.4
4
1
0.1
0.1
1
0.2
0.2
0.2
2
3
Topology
3
0.1
2
Graph
4
nvGRAPHでなにができるの?
主要なAPIは3つ
• Single Source Shortest Path 単一始点から各点への最短路長
• Single Source Widest Path 単一始点から各点への最長路長
• Page Rank
ページランク
※ 最短/最長経路 では あ・り・ま・せ・ん
5
Graphのテーブル(表)による表現
0
0.3
0.1
0.4
4
0.1
1
0.2
0.2
0.2
3
0.1
2
 Edgeは重複してはならない
 重みは0より大きい
#
source
_indices[E]
destination weights[E]
_indices[E]
0
3
0
0.4
1
4
0
0.1
2
0
1
0.2
3
2
1
0.4
4
4
1
0.2
5
1
2
0.3
6
3
2
0.1
7
4
3
0.1
8
3
4
0.2
※ destination, source で昇順にソート
Edge数
6
GraphをSQL スキーマで書くと:
CREATE TABLE graph (
source
INTEGER,
← 入口
destination INTEGER
← 出口
weight
← 重み
REAL,
…
UNIQUE ( source, destination ),
← Edgeは重複しない
CHECK ( weight > 0.0 )
← 重み > 0.0
)
7
source, destination, weight を手に入れて…
SELECT
source, destination, weight
FROM
graph
ORDER BY
destination, source ASC
#
source
_indices[E]
destination weights[E]
_indices[E]
0
3
0
0.4
1
4
0
0.1
2
0
1
0.2
3
2
1
0.4
4
4
1
0.2
5
1
2
0.3
6
3
2
0.1
7
4
3
0.1
8
3
4
0.2
Edge数
9
destination を圧縮する
#
destination_indices[E]
#
destination_offsets[V+1]
0
0
0
0
1
0
1
2
2
1
2
5
3
1
3
7
4
1
4
8
5
2
5
9
6
2
7
3
8
4
Edge数
Vertex数+1
※ cuSPARSE : cusparseXcoo2csr で圧縮できます!
※ nvGRAPH : nvgraphConvertTopology,
nvgraphConvertGraph も用意されています!
ソートもついでにやってくれますよ♪
10
つまるところnvGRAPHに食わすdataは:
疎行列(sparse matrix)ではCSC-formatと称されます
Topology
重み
source_indices[E]
destination_offsets[V+1]
weights[E]
3
0
0.4
4
2
0.1
0
5
0.2
2
7
0.4
4
8
0.2
1
9
0.3
3
0.1
4
0.1
3
0.2
11
nvGRAPH Cheat Sheet(1)
1
nvgraphHandle_t
2
nvgraphGraphDescr_t
4
float EdgeData[E]
Topology
6
float [E]
weight列
5
float VertexData[V]
8
float[V]
3
nvgraphCSCTopolugy32I_st
int
int
int*
int*
nvertices;
V: Vertex数
nedges;
E: Edge数
destination_offsets;
source_indices;
計算結果
7
function
device領域でもOK
float[V+1]
float[E]
(圧縮された) destination列
source列
12
nvGRAPH Cheat Sheet(2)
つくる
こわす
書く
読む
nvgraphCreate [1]
nvgraphDestroy
nvgraphCreateGraphDescr [2]
nvgraphDestroyGraphDescr
nvgraphSetGraphStructure [3]
nvgraphGetGraphStructure
nvgraphAllocateEdgeData [4]
nvgraphSetEdgeData [6]
nvgraphGetEdgeData
nvgraphAllocateVertexData [5]
nvgraphSetVertexData
nvgraphGetVertexData [8]
Function [7]
nvgraphSssp
単一始点から各点への最短路長
nvgraphWidestPath 単一始点から各点への最長路長
nvgraphPagerank
ページランク
13
Demo : 「世間は(意外と)狭い」
14
Thank you!
επιστημη
BLOG:
http://blog.zaq.ne.jp/fareastprogramming/
FACEBOOK: https://www.facebook.com/cppepisteme
TWITTER: @epitwit