Submit Search
Upload
動的計画法の並列化
•
0 likes
•
767 views
P
Proktmr
Follow
JOI 夏季セミナー 2019 最終発表のスライドです.アニメーションが消失しているのでわかりにくいです.
Read less
Read more
Engineering
Report
Share
Report
Share
1 of 70
Recommended
組合せ最適化入門:線形計画から整数計画まで
組合せ最適化入門:線形計画から整数計画まで
Shunji Umetani
最適輸送の解き方
最適輸送の解き方
joisino
明日使えないすごいビット演算
明日使えないすごいビット演算
京大 マイコンクラブ
色々なダイクストラ高速化
色々なダイクストラ高速化
yosupo
プログラムを高速化する話
プログラムを高速化する話
京大 マイコンクラブ
coordinate descent 法について
coordinate descent 法について
京都大学大学院情報学研究科数理工学専攻
線形計画法入門
線形計画法入門
Shunji Umetani
プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法
Takuya Akiba
Recommended
組合せ最適化入門:線形計画から整数計画まで
組合せ最適化入門:線形計画から整数計画まで
Shunji Umetani
最適輸送の解き方
最適輸送の解き方
joisino
明日使えないすごいビット演算
明日使えないすごいビット演算
京大 マイコンクラブ
色々なダイクストラ高速化
色々なダイクストラ高速化
yosupo
プログラムを高速化する話
プログラムを高速化する話
京大 マイコンクラブ
coordinate descent 法について
coordinate descent 法について
京都大学大学院情報学研究科数理工学専攻
線形計画法入門
線形計画法入門
Shunji Umetani
プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法
Takuya Akiba
指数時間アルゴリズム入門
指数時間アルゴリズム入門
Yoichi Iwata
AVX-512(フォーマット)詳解
AVX-512(フォーマット)詳解
MITSUNARI Shigeo
計算機アーキテクチャを考慮した高能率画像処理プログラミング
計算機アーキテクチャを考慮した高能率画像処理プログラミング
Norishige Fukushima
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
Takuya Akiba
組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門
Norishige Fukushima
マルチコアを用いた画像処理
マルチコアを用いた画像処理
Norishige Fukushima
ウェーブレット木の世界
ウェーブレット木の世界
Preferred Networks
画像処理の高性能計算
画像処理の高性能計算
Norishige Fukushima
プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~
Takuya Akiba
ZDD入門-お姉さんを救う方法
ZDD入門-お姉さんを救う方法
nishio
最小カットを使って「燃やす埋める問題」を解く
最小カットを使って「燃やす埋める問題」を解く
shindannin
最適化超入門
最適化超入門
Takami Sato
プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜
京大 マイコンクラブ
Chokudai search
Chokudai search
AtCoder Inc.
Tensor コアを使った PyTorch の高速化
Tensor コアを使った PyTorch の高速化
Yusuke Fujimoto
[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介
[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介
Preferred Networks
最適輸送入門
最適輸送入門
joisino
いまさら聞けない!CUDA高速化入門
いまさら聞けない!CUDA高速化入門
Fixstars Corporation
競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性
Hibiki Yamashiro
はじめてのKrylov部分空間法
はじめてのKrylov部分空間法
tmaehara
ぱっと見でわかるC++11
ぱっと見でわかるC++11
えぴ 福田
Halide による画像処理プログラミング入門
Halide による画像処理プログラミング入門
Fixstars Corporation
More Related Content
What's hot
指数時間アルゴリズム入門
指数時間アルゴリズム入門
Yoichi Iwata
AVX-512(フォーマット)詳解
AVX-512(フォーマット)詳解
MITSUNARI Shigeo
計算機アーキテクチャを考慮した高能率画像処理プログラミング
計算機アーキテクチャを考慮した高能率画像処理プログラミング
Norishige Fukushima
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
Takuya Akiba
組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門
Norishige Fukushima
マルチコアを用いた画像処理
マルチコアを用いた画像処理
Norishige Fukushima
ウェーブレット木の世界
ウェーブレット木の世界
Preferred Networks
画像処理の高性能計算
画像処理の高性能計算
Norishige Fukushima
プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~
Takuya Akiba
ZDD入門-お姉さんを救う方法
ZDD入門-お姉さんを救う方法
nishio
最小カットを使って「燃やす埋める問題」を解く
最小カットを使って「燃やす埋める問題」を解く
shindannin
最適化超入門
最適化超入門
Takami Sato
プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜
京大 マイコンクラブ
Chokudai search
Chokudai search
AtCoder Inc.
Tensor コアを使った PyTorch の高速化
Tensor コアを使った PyTorch の高速化
Yusuke Fujimoto
[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介
[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介
Preferred Networks
最適輸送入門
最適輸送入門
joisino
いまさら聞けない!CUDA高速化入門
いまさら聞けない!CUDA高速化入門
Fixstars Corporation
競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性
Hibiki Yamashiro
はじめてのKrylov部分空間法
はじめてのKrylov部分空間法
tmaehara
What's hot
(20)
指数時間アルゴリズム入門
指数時間アルゴリズム入門
AVX-512(フォーマット)詳解
AVX-512(フォーマット)詳解
計算機アーキテクチャを考慮した高能率画像処理プログラミング
計算機アーキテクチャを考慮した高能率画像処理プログラミング
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門
マルチコアを用いた画像処理
マルチコアを用いた画像処理
ウェーブレット木の世界
ウェーブレット木の世界
画像処理の高性能計算
画像処理の高性能計算
プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~
ZDD入門-お姉さんを救う方法
ZDD入門-お姉さんを救う方法
最小カットを使って「燃やす埋める問題」を解く
最小カットを使って「燃やす埋める問題」を解く
最適化超入門
最適化超入門
プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜
Chokudai search
Chokudai search
Tensor コアを使った PyTorch の高速化
Tensor コアを使った PyTorch の高速化
[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介
[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介
最適輸送入門
最適輸送入門
いまさら聞けない!CUDA高速化入門
いまさら聞けない!CUDA高速化入門
競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性
はじめてのKrylov部分空間法
はじめてのKrylov部分空間法
Similar to 動的計画法の並列化
ぱっと見でわかるC++11
ぱっと見でわかるC++11
えぴ 福田
Halide による画像処理プログラミング入門
Halide による画像処理プログラミング入門
Fixstars Corporation
C++0x in programming competition
C++0x in programming competition
yak1ex
Sec15 dynamic programming
Sec15 dynamic programming
Keisuke OTAKI
人工無脳バトル 1st STEP 回答と解説
人工無脳バトル 1st STEP 回答と解説
JustSystems Corporation
TPC-DSから学ぶPostgreSQLの弱点と今後の展望
TPC-DSから学ぶPostgreSQLの弱点と今後の展望
Kohei KaiGai
非静力学海洋モデルkinacoのGPUによる高速化
非静力学海洋モデルkinacoのGPUによる高速化
Takateru Yamagishi
準同型暗号の実装とMontgomery, Karatsuba, FFT の性能
準同型暗号の実装とMontgomery, Karatsuba, FFT の性能
MITSUNARI Shigeo
PL/CUDA - GPU Accelerated In-Database Analytics
PL/CUDA - GPU Accelerated In-Database Analytics
Kohei KaiGai
R高速化
R高速化
Monta Yashi
Siv3Dで楽しむゲームとメディアアート開発
Siv3Dで楽しむゲームとメディアアート開発
Ryo Suzuki
CMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティング
CMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティング
Computational Materials Science Initiative
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
Ryo Sakamoto
20171212 titech lecture_ishizaki_public
20171212 titech lecture_ishizaki_public
Kazuaki Ishizaki
CUDAを利用したPIV解析の高速化
CUDAを利用したPIV解析の高速化
翔新 史
PL/CUDA - Fusion of HPC Grade Power with In-Database Analytics
PL/CUDA - Fusion of HPC Grade Power with In-Database Analytics
Kohei KaiGai
Arduinoでプログラミングに触れてみよう
Arduinoでプログラミングに触れてみよう
Hiromu Yakura
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門
natrium11321
JOI予選はランチの後で
JOI予選はランチの後で
Ken Ogura
20190625 OpenACC 講習会 第3部
20190625 OpenACC 講習会 第3部
NVIDIA Japan
Similar to 動的計画法の並列化
(20)
ぱっと見でわかるC++11
ぱっと見でわかるC++11
Halide による画像処理プログラミング入門
Halide による画像処理プログラミング入門
C++0x in programming competition
C++0x in programming competition
Sec15 dynamic programming
Sec15 dynamic programming
人工無脳バトル 1st STEP 回答と解説
人工無脳バトル 1st STEP 回答と解説
TPC-DSから学ぶPostgreSQLの弱点と今後の展望
TPC-DSから学ぶPostgreSQLの弱点と今後の展望
非静力学海洋モデルkinacoのGPUによる高速化
非静力学海洋モデルkinacoのGPUによる高速化
準同型暗号の実装とMontgomery, Karatsuba, FFT の性能
準同型暗号の実装とMontgomery, Karatsuba, FFT の性能
PL/CUDA - GPU Accelerated In-Database Analytics
PL/CUDA - GPU Accelerated In-Database Analytics
R高速化
R高速化
Siv3Dで楽しむゲームとメディアアート開発
Siv3Dで楽しむゲームとメディアアート開発
CMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティング
CMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティング
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
20171212 titech lecture_ishizaki_public
20171212 titech lecture_ishizaki_public
CUDAを利用したPIV解析の高速化
CUDAを利用したPIV解析の高速化
PL/CUDA - Fusion of HPC Grade Power with In-Database Analytics
PL/CUDA - Fusion of HPC Grade Power with In-Database Analytics
Arduinoでプログラミングに触れてみよう
Arduinoでプログラミングに触れてみよう
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門
JOI予選はランチの後で
JOI予選はランチの後で
20190625 OpenACC 講習会 第3部
20190625 OpenACC 講習会 第3部
動的計画法の並列化
1.
動的計画法の並列化 きたむー (@Pro_ktmr)
2.
自己紹介 • きたむー (@Pro_ktmr) •
大阪府立 大手前高校 3年 • 『CUDA C プロフェッショナル プログラミング』 班 • ほとんど読んでない・・・ • 去年の夏季セミにもいた 2
3.
1年間の成長 夏季セミナー2018 • AtCoder 緑 •
JOI 予選落ち • 大規模開発経験なし • 研究発表で校内1位 夏季セミナー2019 • AtCoder 黄 • JOI春6位 APIO銀メダル • PCKモバ ベストアイデア賞 • SSHのポスター賞 3
4.
1年間の成長 夏季セミナー2018 • AtCoder 緑 •
JOI 予選落ち • 大規模開発経験なし • 研究発表で校内1位 夏季セミナー2019 • AtCoder 黄 • APIO 銀メダル • PCKモバ ベストアイデア賞 • 研究発表で全国レベルの賞 4 夏季セミでトップ層と 交流できたから
5.
ストーリー 第1話 GPU • CPUの前に突如現れたGPUとは? 第2話
条件分岐 • minとmaxが危ない! 第3話 ナップサック問題 • ピクニックに行こう 第4話 巡回セールスマン問題 • bitDPと戦え! 5
6.
第1話 GPU CPUの前に突如現れたGPUとは? 6
7.
7 CPU GPUコア GPUコア GPUコア GPUコア GPUコア GPUコア GPUコア GPUコア GPUコア
8.
CPUとGPU CPU 普通1コアだけ 賢い 早い GPU コアたくさん(3000とか) 賢くない 遅い 8 CPU GPUコア GPUコア GPUコア GPUコア GPUコア GPUコア GPUコア GPUコア GPUコア
9.
CPUとGPU CPU 普通1コアだけ 賢い 早い GPU コアたくさん(3000とか) 賢くない 遅い 9 CPU GPUコア GPUコア GPUコア GPUコア GPUコア GPUコア GPUコア GPUコア GPUコア ワンオペレー ションだピタ バカも集まれば 文殊の知恵ピタ
10.
CPUとGPU CPU 普通1コアだけ 賢い 早い GPU コアたくさん(3000とか) 賢くない 遅い 10 CPU GPUコア GPUコア GPUコア GPUコア GPUコア GPUコア GPUコア GPUコア GPUコア 賢いから何でも できるピタ 簡単なことを並 列処理できるピ
11.
CPUとGPU CPU 普通1コアだけ 賢い 早い GPU コアたくさん(3000とか) 賢くない 遅い 11 CPU GPUコア GPUコア GPUコア GPUコア GPUコア GPUコア GPUコア GPUコア GPUコア 賢いから何でも できるピタ 簡単なことを並 列処理できるピ その処理,並列化できる??
12.
並列化できる処理 int A[5000], B[5000],
C[5000]; for(int i=0; i<5000; i++){ C[i] = A[i] + B[i]; } 12
13.
並列化できる処理 int A[5000], B[5000],
C[5000]; for(int i=0; i<5000; i++){ C[i] = A[i] + B[i]; } 13 GPUコア …… C[0]=A[0]+B[0] GPUコア C[1]=A[1]+B[1] GPUコア C[2]=A[2]+B[2] GPUコア C[3]=A[3]+B[3]
14.
並列化できない処理 int A[5002] =
{1,1}; for(int i=0; i<5000; i++){ A[i+2] = A[i] + A[i+1]; } 14
15.
並列化できない処理 int A[5002] =
{1,1}; for(int i=0; i<5000; i++){ A[i+2] = A[i] + A[i+1]; } 逐次処理の必要あり → 並列化難しい 15
16.
動的計画法とは (Wikipedia) 下記2条件を満たすアルゴリズムの総称である. • 帰納的な関係の利用:より小さな問題例の解や計算 結果を帰納的な関係を利用してより大きな問題例を 解くのに使用する. •
計算結果の記録:小さな問題例,計算結果から記録 し,同じ計算を何度も行うことを避ける.帰納的な関 係での参照を効率よく行うために,計算結果は整数, 文字やその組みなどを見出しにして管理される. 16
17.
動的計画法とは (Wikipedia) 下記2条件を満たすアルゴリズムの総称である. • 帰納的な関係の利用:より小さな問題例の解や計算 結果を帰納的な関係を利用してより大きな問題例を 解くのに使用する. •
計算結果の記録:小さな問題例,計算結果から記録 し,同じ計算を何度も行うことを避ける.帰納的な関 係での参照を効率よく行うために,計算結果は整数, 文字やその組みなどを見出しにして管理される. 17
18.
動的計画法 18 とても 小さな 問題 ほどほどに 小さな 問題 少し 大きな 問題 とても 大きな 問題 順番に処理しなければならない!
19.
動的計画法 19 とても 小さな 問題 ほどほどに 小さな 問題 少し 大きな 問題 とても 大きな 問題 順番に処理しなければならない! DPを並列化できたら強い!!
20.
ストーリー 第1話 GPU • CPUの前に突如現れたGPUとは? 第2話
条件分岐 • minとmaxが危ない! 第3話 ナップサック問題 • ピクニックに行こう 第4話 巡回セールスマン問題 • bitDPと戦え! 20
21.
第2話 条件分岐 minとmaxが危ない! 21
22.
22 GPUコア GPUコア 10 <
5 かも いや 10 = 5
23.
23 isPitaro true false GPUコア GPUコア
24.
GPUは遅い GPUはバカなので,条件分岐すると遅い しかも,足並みをそろえがち 条件分岐は少ない方がよい 24
25.
ところで動的計画法 ナップサック問題の漸化式 𝑉 𝑖, 𝑤
= max 𝑉 𝑖 − 1, 𝑤 , 𝑉 𝑖 − 1, 𝑤 − 𝑤𝑖 + 𝑣𝑖 25
26.
ところで動的計画法 ナップサック問題の漸化式 𝑉 𝑖, 𝑤
= 𝐦𝐚𝐱 𝑉 𝑖 − 1, 𝑤 , 𝑉 𝑖 − 1, 𝑤 − 𝑤𝑖 + 𝑣𝑖 DPの漸化式には max や min が多々存在 26
27.
ところで動的計画法 ナップサック問題の漸化式 𝑉 𝑖, 𝑤
= 𝐦𝐚𝐱 𝑉 𝑖 − 1, 𝑤 , 𝑉 𝑖 − 1, 𝑤 − 𝑤𝑖 + 𝑣𝑖 DPの漸化式には max や min が多々存在 27 maxやminを条件分岐なしで 実装出来たら・・・
28.
maxとminをビット演算で実装 int max(int a,
int b){ if(a > b) return a; else return b; } int max(int a, int b){ return ((-(a>b)) & a) + ((-(a<=b)) & b); } 28
29.
maxとminをビット演算で実装 ・ 𝑎 >
𝑏 のとき int max(int a, int b){ return ((-(a>b)) & a) + ((-(a<=b)) & b); } ・ 𝑎 ≤ 𝑏 のとき int max(int a, int b){ return ((-(a>b)) & a) + ((-(a<=b)) & b); } 29
30.
maxとminをビット演算で実装 ・ 𝑎 >
𝑏 のとき int max(int a, int b){ return ((-1) & a) + ((0) & b); } ・ 𝑎 ≤ 𝑏 のとき int max(int a, int b){ return ((0) & a) + ((-1) & b); } 30
31.
maxとminをビット演算で実装 ・ 𝑎 >
𝑏 のとき int max(int a, int b){ return ((・・・1111) & a) + ((・・・0000) & b); } ・ 𝑎 ≤ 𝑏 のとき int max(int a, int b){ return ((・・・0000) & a) + ((・・・1111) & b); } 31 2進数表記
32.
ストーリー 第1話 GPU • CPUの前に突如現れたGPUとは? 第2話
条件分岐 • minとmaxが危ない! 第3話 ナップサック問題 • ピクニックに行こう 第4話 巡回セールスマン問題 • bitDPと戦え! 32
33.
第3話 ナップサック問題 ピクニックに行こう! 33
34.
(一応)問題文 価値が 𝑣𝑖 重さが
𝑤𝑖 であるような 𝑁 個の品物と,容量 が 𝑊 のナップザックがあります.次の条件を満たすよ うに,品物を選んでナップザックに入れます: • 選んだ品物の価値の合計をできるだけ高くする. • 選んだ品物の重さの総和は 𝑊 を超えない. 価値の合計の最大値を求めてください. (http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=DPL_1_B&lang=jp) 34
35.
並列化したい 漸化式は 𝑉 𝑖, 𝑤
= max 𝑉 𝑖 − 1, 𝑤 , 𝑉 𝑖 − 1, 𝑤 − 𝑤𝑖 + 𝑣𝑖 つまり 𝑉 𝑖, ? = max 𝑉 𝑖 − 1, ? , 𝑉 𝑖 − 1, ? + 𝑣𝑖 35
36.
並列化したい 漸化式は 𝑉 𝑖, 𝑤
= max 𝑉 𝑖 − 1, 𝑤 , 𝑉 𝑖 − 1, 𝑤 − 𝑤𝑖 + 𝑣𝑖 つまり 𝑉 𝑖, ? = max 𝑉 𝑖 − 1, ? , 𝑉 𝑖 − 1, ? + 𝑣𝑖 𝑉 𝑖, ? を求めるのに 𝑉 𝑖 − 1,0 ~𝑉 𝑖 − 1, 𝑊 が必要 𝑉 𝑖, ? を求めるのに 𝑉 𝑖, 0 ~𝑉 𝑖, 𝑊 は必要ない 36
37.
並列化したい 遷移を図でも観察すると 37
38.
並列化したい 遷移を図でも観察すると 38 ひ と か た ま り ひ と か た ま り ひ と か た ま り ひ と か た ま り
39.
並列化したい 遷移を図でも観察すると 39 ひ と か た ま り ひ と か た ま り ひ と か た ま り ひ と か た ま り GPUコア GPUコア GPUコア GPUコア GPUコア GPUコア
40.
並列化したい 遷移を図でも観察すると 40 ひ と か た ま り ひ と か た ま り ひ と か た ま り ひ と か た ま り GPUコア GPUコア GPUコア GPUコア GPUコア GPUコア 𝑵 回のループをCPUで回して 𝑾 個の処理をGPUで並列化
41.
ソースコード (抜粋) #define BS
1000 __global__ void solve(int W, int *w, long long *v, long long *dp, int i){ int j = blockIdx.x*blockDim.x + threadIdx.x; if(j >= W) return; dp[(i&1)*(W+1)+j] = dmax(dp[((i-1)&1)*(W+1)+j], -(j>=w[i]) & (dp[dmax(0,((i-1)&1)*(W+1)+j-w[i])]+v[i])); } int main(){ (入力の受け取り,メモリのコピーなど) solve0<<<(W +BS-1)/BS,BS>>>(W, dw, dv, dp, 0); for(int i=1; i<N; i++){ cudaDeviceSynchronize(); solve<<<(W +BS-1)/BS,BS>>>(W, dw, dv, dp, i); } (答えの出力など) } 41 CUDAの解説は 次以降の人の発表を聞いてね!
42.
計算速度の比較 CPU N 103 104 105 W 103 3.579 20.32 187.5 104 19.00
175.6 1746 105 178.7 1720 17064 GPU N 103 104 105 W 103 219.1 319.4 1323 104 222.9 322.9 1299 105 237.5 326.1 1336 42 各20種のテストケースで計測した平均値 [単位:ms]
43.
計算速度の比較 43 CPU GPU N 103 104 105 W 103 0.016 0.06 0.142 104 0.085
0.544 1.345 105 0.753 5.275 12.77 GPUはCPUの 𝑛 倍高速
44.
計算速度の比較 44 CPU GPU N 103 104 105 W 103 0.016 0.06 0.142 104 0.085
0.544 1.345 105 0.753 5.275 12.77 GPUはCPUの 𝑛 倍高速 12倍高速化
45.
計算速度の比較 45 CPU GPU N 103 104 105 W 103 0.016 0.06 0.142 104 0.085
0.544 1.345 105 0.753 5.275 12.77 GPUはCPUの 𝑛 倍高速 12倍高速化
46.
計算速度の比較 46 CPU GPU N 103 104 105 W 103 0.016 0.06 0.142 104 0.085
0.544 1.345 105 0.753 5.275 12.77 GPUはCPUの 𝑛 倍高速 12倍高速化
47.
計算速度の比較 (N=105) 47 0 5000 10000 15000 20000 1e3 1e4
1e5 W GPU CPU [単位:ms]
48.
計算速度の比較 (N=105) 48 0 5000 10000 15000 20000 1e3 1e4
1e5 W GPU CPU [単位:ms]
49.
計算速度の比較 (N=105) 49 0 5000 10000 15000 20000 1e3 1e4
1e5 W GPU CPU [単位:ms]
50.
計算速度の比較 (N=105) 50 0 5000 10000 15000 20000 1e3 1e4
1e5 W GPU CPU [単位:ms] GPUすごい!
51.
ストーリー 第1話 GPU • CPUの前に突如現れたGPUとは? 第2話
条件分岐 • minとmaxが危ない! 第3話 ナップサック問題 • ピクニックに行こう 第4話 巡回セールスマン問題 • bitDPと戦え! 51
52.
第4話 巡回セールスマン問題 bitDPと戦え! 52
53.
(一応)問題文 重み付き有向グラフ 𝐺(𝑉, 𝐸)
について,以下の条件を満 たす最短経路の距離を求めて下さい: • ある頂点から出発し,出発点へ戻る閉路である. • 各頂点をちょうど 1 度通る. (http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=DPL_2_A&lang=jp) 53
54.
(一応)解法 • 頂点 0
から巡回を始めるとして一般性を失わない • 今いる頂点の番号 𝑉 通り,すでに行ったことのある 頂点の情報 2 𝑉 通りを持ってbitDP • 各遷移は次にどの頂点に行くかの 𝑉 通り • 𝑂(𝑉2 2 𝑉 ) 54
55.
bitDPを並列化したい もらうDPを考える 例) 𝑑𝑝 010101
を計算するには 𝑑𝑝 0𝟎0101 , 𝑑𝑝 010𝟎01 , 𝑑𝑝 01010𝟎 が必要 55
56.
bitDPを並列化したい もらうDPを考える 例) 𝑑𝑝 010101
を計算するには 𝑑𝑝 0𝟎0101 , 𝑑𝑝 010𝟎01 , 𝑑𝑝 01010𝟎 が必要 【一般化】 𝑛 bit 立っている 𝑑𝑝 を求めるには 𝑛 − 1 bit 立っている 𝑑𝑝 が必要 56
57.
bitDPを並列化したい 図示すると 57 0000 0001 0010 0100 1000 0011 0101 0110 1001 1010 1100 0111 1011 1101 1110 1111
58.
bitDPを並列化したい 図示すると 58 0000 0001 0010 0100 1000 0011 0101 0110 1001 1010 1100 0111 1011 1101 1110 1111 ビ ッ ト 0 グ ル ー プ ビ ッ ト 1 グ ル ー プ ビ ッ ト 2 グ ル ー プ ビ ッ ト 3 グ ル ー プ ビ ッ ト 4 グ ル ー プ 𝑉 + 1
グループ
59.
bitDPを並列化したい 図示すると 59 0000 0001 0010 0100 1000 0011 0101 0110 1001 1010 1100 0111 1011 1101 1110 1111 ビ ッ ト 0 グ ル ー プ ビ ッ ト 1 グ ル ー プ ビ ッ ト 2 グ ル ー プ ビ ッ ト 3 グ ル ー プ ビ ッ ト 4 グ ル ー プ 𝑉 + 1
グループ GPUコア GPUコア GPUコア GPUコア GPUコア GPUコア
60.
ソースコード (抜粋) __global__ void
solve(int *d, int *state, int *num, int *dp, int V, int i){ int j = blockIdx.x*blockDim.x + threadIdx.x; if(j >= num[i]*V) return; int k = j % V; j /= V; if(!((state[j*V+i]>>k)&1)) return; for(int l=0; l<V; l++) dp[state[j*V+i]*V+k] = dmin(dp[state[j*V+i]*V+k], dp[(state[j*V+i]^(1<<k))*V+l]+d[l*V+k]); } int main(){ (入力の受け取りなど) for(int i=0; i<V+1; i++) num[i] = 0 for(int i=0; i<(1<<V); i++){ int c = 0; for(int j=1; j<(1<<V); j<<=1) if(i&j) c++; state[num[c]*V+c] = i; num[c]++; } (メモリのコピーなど) for(int i=0; i<=V; i++){ solve<<<(num[i]*V +BS-1)/BS,BS>>>(dd, dstate, dnum, dp, V, i); cudaDeviceSynchronize(); } (答えの出力など) } 60 CUDAの解説は 次以降の人の発表を聞いてね!
61.
計算速度の比較 CPU V time V
time V time 2 1.9 11 2.15 20 690.2 3 1.75 12 2.75 21 1563.6 4 1.85 13 4.05 22 3498.8 5 1.7 14 6.7 23 7826.6 6 1.55 15 13.4 24 17303 7 1.75 16 27.35 25 37929 8 1.85 17 58.4 26 81735 9 1.8 18 131 10 2.1 19 297.35 GPU V time V time V time 2 150 11 151.5 20 221.4 3 152 12 151.3 21 297.5 4 150.35 13 153.3 22 405.05 5 151.65 14 153.2 23 691.55 6 150.2 15 155.5 24 1296.6 7 150.05 16 154.3 25 2597.6 8 152.2 17 158.55 26 5356.5 9 151.6 18 166.2 10 151.6 19 183.5 61 各20種のテストケースで計測した平均値 [単位:ms]
62.
計算速度の比較 (V≦22) 62 0 1000 2000 3000 4000 2 4
6 8 10 12 14 16 18 20 22 CPU GPU [単位:ms]
63.
計算速度の比較 (V≦22) 63 0 1000 2000 3000 4000 2 4
6 8 10 12 14 16 18 20 22 CPU GPU GPUは起動に 時間がかかる [単位:ms]
64.
計算速度の比較 (V≦26) 64 0 10000 20000 30000 40000 50000 60000 70000 80000 90000 2 4
6 8 10 12 14 16 18 20 22 24 26 CPU GPU [単位:ms]
65.
計算速度の比較 (V≦26) 65 0 10000 20000 30000 40000 50000 60000 70000 80000 90000 2 4
6 8 10 12 14 16 18 20 22 24 26 CPU GPU CPU82秒 GPU5秒 約16倍高速! [単位:ms]
66.
計算速度の比較 (V≦26) 66 0 10000 20000 30000 40000 50000 60000 70000 80000 90000 2 4
6 8 10 12 14 16 18 20 22 24 26 [単位:ms] GPU CPU CPU82秒 GPU5秒 約16倍高速! https://umaibou.jp/product/
67.
計算速度の比較 (V≦26) 67 0 10000 20000 30000 40000 50000 60000 70000 80000 90000 2 4
6 8 10 12 14 16 18 20 22 24 26 [単位:ms] GPU CPU CPU82秒 GPU5秒 約16倍高速! https://umaibou.jp/product/
68.
68
69.
まとめ • 性能の悪いコアがたくさん集まったのがGPU • 条件分岐をbit演算に落とし込むと高速 •
maxやminも • DPは「ひとかたまり」を意識して並列化 • bitDPは「ビット数のグループ」ごとに並列化 • 最大で約16倍高速になった! 69
70.
Thank you