SlideShare a Scribd company logo
1 of 39
Download to read offline
C++ For Researchers
研究生のためのC++
企画・立案 難波知宏
プログラムの高速化
第七回
2
プログラム改良のステップ
3
原因の特定
高速化① 最適化
高速化② アルゴリズムの改良
高速化③ マルチスレッド
高速化④ GPUアクセラレーション
ボトルネックの特定
第一節
4
Visual Studioのパフォーマンスエクスプローラを使ってみよう
5
Exercise 7-1
プログラムのどの部分にどれくらいの負荷がかかっているか調べること
ができるツール
6
パフォーマンスエクスプローラー
7
パフォーマンスエクスプローラーの使い方
8
パフォーマンス測定結果の見方
どの関数にどれくらい
の負荷がかかっている
かわかる
概要ビューで全体が
わかる
9
パフォーマンス測定結果の見方
プログラムのどこが
遅いかわかる
関数の詳細ビューで
ボトルネックの場所が
わかる
最適化
第二節
10
最適化
11
コンパイラで最適化(自動)
• コンパイルオプションを変えることで
コンパイラが最適化を行う
• とりあえず楽。
プログラマが最適化(手動)
• プログラマがプログラムをいじって
手動で最適化を行う
• めんどくさい。
• コンパイラオプションで最適化して、
まだ遅いときにやろう
12
コンパイラによる最適化有効
ビルド構成をDebugモード
から
Releaseモードにする
SIMD拡張命令セット (Single Instruction Multi Data)
一つの命令で複数のデータを扱う (float×8やdouble×4の演算を一回の命令でやる)
13
Intel SSE / AVX
1.0 2.0 3.0 4.0
2.0 4.0 6.0 8.0
+
↓
専用レジスタ
専用レジスタ
1.0 2.0 3.0 4.0
64×4=256bit
14
Intel SSE / AVXの有効化
プロジェクトのプロパティ >
C/C++ > コード生成の拡張命令
セットを変更 でIntel SSE/AVXの
有効化
sample 7-05
#include <immintrin.h>
#include <iostream>
using namespace std;
void main()
{
__m256d a = _mm256_set_pd(1.0, 2.0, 3.0,
4.0);
__m256d b = _mm256_set_pd(1.0, 2.0, 3.0,
4.0);
__m256d c = _mm256_add_pd(a, b);
cout << c.m256d_f64[0] << endl;
cout << c.m256d_f64[1] << endl;
cout << c.m256d_f64[2] << endl;
cout << c.m256d_f64[3] << endl;
}
実行結果
8
6
4
2
15
z
Intel SSE / AVXの手動プログラミング
16
ただし
自動ベクトル化
最近のコンパイラは使えそうなところは自動でSIMD
命令を使う
Visual C++の自動ベクトル化の説明
https://msdn.microsoft.com/ja-jp/library/hh872235.aspx
自動ベクトル化はどんな時に行われるか
http://www.isus.jp/products/c-compilers/compiler_part4/
SIMD命令をgccのオートベクタライズの最適化で使う方法
http://blog.kmckk.com/archives/4484762.html
17
自動ベクトル化
最近のコンパイラは使えそうなところは自動でSIMD
命令を使う
Visual C++の自動ベクトル化の説明
https://msdn.microsoft.com/ja-jp/library/hh872235.aspx
自動ベクトル化はどんな時に行われるか
http://www.isus.jp/products/c-compilers/compiler_part4/
SIMD命令をgccのオートベクタライズの最適化で使う方法
http://blog.kmckk.com/archives/4484762.html
18
基本コンパイラ任せ
で良さげ
高速化のために、まずは
• 最適化オプションをつける
• 拡張命令セットを有効にする
19
ここまでのまとめ
アルゴリズムの改良
第三節
20
sample 7-06
static int a[length];
static int b[length];
static int c[length];
for (int i = 0; i < length; i++)
{
c[i] = a[i] + b[i];
}
sample 7-07
struct int3 { int a, b, c; };
static int3 x[length];
for (int i = 0; i < length; i++)
{
x[i].c = x[i].a + x[i].b;
}
21
アルゴリズムの改良
①キャッシュミスを減らせ
どっちのプログラムが早いだろうか
sample 7-06
static int a[length];
static int b[length];
static int c[length];
for (int i = 0; i < length; i++)
{
c[i] = a[i] + b[i];
}
sample 7-07
struct int3 { int a, b, c; };
static int3 x[length];
for (int i = 0; i < length; i++)
{
x[i].c = x[i].a + x[i].b;
}
22
アルゴリズムの改良
①キャッシュミスを減らせ
答え 右
(左: 70msくらい)
(右: 50msくらい)
CPU-メモリ間
23
なぜ右のプログラムの方が早いのか?
高速 低速
CPU-メモリ間
24
なぜ右のプログラムの方が早いのか?
高速 低速
一回アクセスした領域
は、その周辺も含めて
キャッシュメモリに記憶
飛び飛びにアクセスすると、
キャッシュがころころ入れ替わり、
キャッシュヒット率が低下する
for (int i = 0; i < 1024; i++)
{
// …
}
// …
for (int i = 0; i < 1024; i++)
{
// …
}
for (int i = 0; i < 1024; i++)
{
// …
// …
}
25
②ループを減らせ
#include "Eigen¥Dense.hpp"
using namespace Eigen;
void main()
{
MatrixXd A;
}
#include "Eigen¥Sparse.hpp"
using namespace Eigen;
void main()
{
SparseMatrix<float> A;
}
26
③余計な計算を減らせ
スパース行列
日頃から次に気をつけてプログラムを組む
• キャッシュヒット率が上がりやすいプログラムにする
• ループの数を減らす
• 余分な計算を減らす
27
ここまでのまとめ
マルチスレッド
第四節
28
マルチコアCPUだと、異なるCPUコアで同時実行ができる
マルチスレッドプログラミングの方法
• OSのマルチスレッドAPIを使う (Win32APIだとCreateThread関数)
• マルチスレッドライブラリを使う (標準ライブラリ, IntelTBB等)
• 言語拡張(OpenMP)を使う
29
マルチスレッド
複数の処理を並列に実行する
#pragma omp … を既存のプログラムに挿入する形で利用
↓
 プログラムをあまり修正しなくていいので導入が簡単
 コンパイルオプションでOpenMPを無効にすれば、
シングルスレッドのプログラムにすぐに直せる (もとに戻すのが簡単)
 OSに依存しないので移植性が高い
30
OpenMP
マルチスレッド
sample 7-01
// Calculation.
float sum1 = 0, sum2 = 0, sum3 = 0,
sum4 = 0;
#pragma omp parallel sections
{
#pragma omp section
{
for (int i = 0; i < 2500000; i++)
{
sum1 += data[i];
}
}
#pragma omp section
…
}
float sum = sum1 + sum2 + sum3 + sum4;
sample 7-02
// Calculation.
float sum = 0;
{
for (int i = 0; i < length; i++)
{
sum += data[i];
}
}
31
OpenMP プログラム例1 配列の総和を求める
sample 7-01
// Calculation.
float sum1 = 0, sum2 = 0, sum3 = 0,
sum4 = 0;
#pragma omp parallel sections
{
#pragma omp section
{
for (int i = 0; i < 2500000; i++)
{
sum1 += data[i];
}
}
#pragma omp section
…
}
float sum = sum1 + sum2 + sum3 + sum4;
sample 7-02
// Calculation.
float sum = 0;
{
for (int i = 0; i < length; i++)
{
sum += data[i];
}
}
32
OpenMP プログラム例1 配列の総和を求める
配列を4等分して
それぞれ別々に総
和を計算する
素直なやり方
sample 7-01 実行結果
sum is 10000000.000000.
5 ms.
sample 7-02 実行結果
sum is 10000000.000000.
13 ms.
33
OpenMP プログラム例1 配列の総和を求める
配列を4等分して
それぞれで総和を
計算する
素直なやり方
スピードUP
34
OpenMPの有効化
C/C++>言語>OpenMPの
サポートを「はい」にすると
OpenMPが有効になる
sample 7-09
#include <iostream>
void main()
{
#pragma omp parallel for
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
printf("%d¥n", i);
}
}
}
実行結果
Thread is 0
Thread is 3
Thread is 3
Thread is 3
Thread is 3
Thread is 2
Thread is 2
Thread is 2
Thread is 2
Thread is 1
Thread is 1
Thread is 1
Thread is 1
Thread is 0
Thread is 0
Thread is 0
35
OpenMP プログラム例2 for文の並列化
OpenMPで行列積を高速化しよう
36
Exercise 7-2
GPUアクセラレーション
第五節
37
38
時間足りませんでした
39
テンプレート引数で、
型、行数、列数を指定
サイズは
実数のとき固定サイズ
Xのとき可変サイズ

More Related Content

What's hot

データサイエンスワールドからC++を眺めてみる
データサイエンスワールドからC++を眺めてみるデータサイエンスワールドからC++を眺めてみる
データサイエンスワールドからC++を眺めてみるShintaro Fukushima
 
研究生のためのC++ no.3
研究生のためのC++ no.3研究生のためのC++ no.3
研究生のためのC++ no.3Tomohiro Namba
 
200319 eash python_shareslide_functions
200319 eash python_shareslide_functions200319 eash python_shareslide_functions
200319 eash python_shareslide_functionsHiroki Katayama
 
20170131 python3 6 PEP526
20170131 python3 6 PEP526 20170131 python3 6 PEP526
20170131 python3 6 PEP526 masahitojp
 
科学技術計算関連Pythonパッケージの概要
科学技術計算関連Pythonパッケージの概要科学技術計算関連Pythonパッケージの概要
科学技術計算関連Pythonパッケージの概要Toshihiro Kamishima
 
C#勉強会 ~ C#9の新機能 ~
C#勉強会 ~ C#9の新機能 ~C#勉強会 ~ C#9の新機能 ~
C#勉強会 ~ C#9の新機能 ~Fujio Kojima
 
Python for Data Anaysis第2回勉強会4,5章
Python for Data Anaysis第2回勉強会4,5章Python for Data Anaysis第2回勉強会4,5章
Python for Data Anaysis第2回勉強会4,5章Makoto Kawano
 
TensorFlow XLA 「XLAとは、から、最近の利用事例について」
TensorFlow XLA 「XLAとは、から、最近の利用事例について」TensorFlow XLA 「XLAとは、から、最近の利用事例について」
TensorFlow XLA 「XLAとは、から、最近の利用事例について」Mr. Vengineer
 
[第2版]Python機械学習プログラミング 第8章
[第2版]Python機械学習プログラミング 第8章[第2版]Python機械学習プログラミング 第8章
[第2版]Python機械学習プログラミング 第8章Haruki Eguchi
 
おいしいLisp
おいしいLispおいしいLisp
おいしいLispKent Ohashi
 
Fork/Join Framework。そしてLambdaへ。
Fork/Join Framework。そしてLambdaへ。Fork/Join Framework。そしてLambdaへ。
Fork/Join Framework。そしてLambdaへ。Yuichi Sakuraba
 

What's hot (20)

Boost tour 1.60.0 merge
Boost tour 1.60.0 mergeBoost tour 1.60.0 merge
Boost tour 1.60.0 merge
 
データサイエンスワールドからC++を眺めてみる
データサイエンスワールドからC++を眺めてみるデータサイエンスワールドからC++を眺めてみる
データサイエンスワールドからC++を眺めてみる
 
研究生のためのC++ no.3
研究生のためのC++ no.3研究生のためのC++ no.3
研究生のためのC++ no.3
 
Emcjp item21
Emcjp item21Emcjp item21
Emcjp item21
 
200319 eash python_shareslide_functions
200319 eash python_shareslide_functions200319 eash python_shareslide_functions
200319 eash python_shareslide_functions
 
20170131 python3 6 PEP526
20170131 python3 6 PEP526 20170131 python3 6 PEP526
20170131 python3 6 PEP526
 
科学技術計算関連Pythonパッケージの概要
科学技術計算関連Pythonパッケージの概要科学技術計算関連Pythonパッケージの概要
科学技術計算関連Pythonパッケージの概要
 
More C++11
More C++11More C++11
More C++11
 
C#勉強会 ~ C#9の新機能 ~
C#勉強会 ~ C#9の新機能 ~C#勉強会 ~ C#9の新機能 ~
C#勉強会 ~ C#9の新機能 ~
 
boost tour 1.48.0 all
boost tour 1.48.0 allboost tour 1.48.0 all
boost tour 1.48.0 all
 
NumPy闇入門
NumPy闇入門NumPy闇入門
NumPy闇入門
 
Python for Data Anaysis第2回勉強会4,5章
Python for Data Anaysis第2回勉強会4,5章Python for Data Anaysis第2回勉強会4,5章
Python for Data Anaysis第2回勉強会4,5章
 
Introduction of Python
Introduction of PythonIntroduction of Python
Introduction of Python
 
llvm入門
llvm入門llvm入門
llvm入門
 
TensorFlow XLA 「XLAとは、から、最近の利用事例について」
TensorFlow XLA 「XLAとは、から、最近の利用事例について」TensorFlow XLA 「XLAとは、から、最近の利用事例について」
TensorFlow XLA 「XLAとは、から、最近の利用事例について」
 
[第2版]Python機械学習プログラミング 第8章
[第2版]Python機械学習プログラミング 第8章[第2版]Python機械学習プログラミング 第8章
[第2版]Python機械学習プログラミング 第8章
 
Functional Way
Functional WayFunctional Way
Functional Way
 
おいしいLisp
おいしいLispおいしいLisp
おいしいLisp
 
Fork/Join Framework。そしてLambdaへ。
Fork/Join Framework。そしてLambdaへ。Fork/Join Framework。そしてLambdaへ。
Fork/Join Framework。そしてLambdaへ。
 
Boost Tour 1.48.0 diff
Boost Tour 1.48.0 diffBoost Tour 1.48.0 diff
Boost Tour 1.48.0 diff
 

Viewers also liked (16)

Rango celdas autorellenar
Rango celdas autorellenarRango celdas autorellenar
Rango celdas autorellenar
 
..Festival Der Zeppeline
..Festival Der Zeppeline..Festival Der Zeppeline
..Festival Der Zeppeline
 
Music Distribution Presentation
Music Distribution PresentationMusic Distribution Presentation
Music Distribution Presentation
 
Diseño de tablas
Diseño de tablasDiseño de tablas
Diseño de tablas
 
Reference Pete
Reference PeteReference Pete
Reference Pete
 
E tefl
E teflE tefl
E tefl
 
Music Distribution_MVT-SUGO
Music Distribution_MVT-SUGOMusic Distribution_MVT-SUGO
Music Distribution_MVT-SUGO
 
La celebración pedagógica como eje
La celebración pedagógica como ejeLa celebración pedagógica como eje
La celebración pedagógica como eje
 
Taller NTIC
Taller NTICTaller NTIC
Taller NTIC
 
La historia interminable
La historia interminableLa historia interminable
La historia interminable
 
Great ideas in music distribution
Great ideas in music distributionGreat ideas in music distribution
Great ideas in music distribution
 
Yeny andrea Contreras
Yeny andrea ContrerasYeny andrea Contreras
Yeny andrea Contreras
 
Presentation1 incoterms 2010
Presentation1 incoterms 2010Presentation1 incoterms 2010
Presentation1 incoterms 2010
 
Resume_Rajini (1)
Resume_Rajini (1)Resume_Rajini (1)
Resume_Rajini (1)
 
درباره ی بلوبری
درباره ی بلوبریدرباره ی بلوبری
درباره ی بلوبری
 
string , pointer
string , pointerstring , pointer
string , pointer
 

Similar to 研究生のためのC++ no.7

Windows HPC Server 講習会 第2回 開発編
Windows HPC Server 講習会 第2回 開発編Windows HPC Server 講習会 第2回 開発編
Windows HPC Server 講習会 第2回 開発編Osamu Masutani
 
TotalViewを使ったFOCUSスパコンでのデバッグ体験 2016
TotalViewを使ったFOCUSスパコンでのデバッグ体験 2016TotalViewを使ったFOCUSスパコンでのデバッグ体験 2016
TotalViewを使ったFOCUSスパコンでのデバッグ体験 2016RWSJapan
 
Windows PowerShell 2.0 の基礎知識
Windows PowerShell 2.0 の基礎知識Windows PowerShell 2.0 の基礎知識
Windows PowerShell 2.0 の基礎知識shigeya
 
「NVIDIA プロファイラを用いたPyTorch学習最適化手法のご紹介(修正版)」
「NVIDIA プロファイラを用いたPyTorch学習最適化手法のご紹介(修正版)」「NVIDIA プロファイラを用いたPyTorch学習最適化手法のご紹介(修正版)」
「NVIDIA プロファイラを用いたPyTorch学習最適化手法のご紹介(修正版)」ManaMurakami1
 
Capistranoで自動デプロイ
Capistranoで自動デプロイCapistranoで自動デプロイ
Capistranoで自動デプロイtoyoshi
 
2015年度GPGPU実践プログラミング 第3回 GPGPUプログラミング環境
2015年度GPGPU実践プログラミング 第3回 GPGPUプログラミング環境2015年度GPGPU実践プログラミング 第3回 GPGPUプログラミング環境
2015年度GPGPU実践プログラミング 第3回 GPGPUプログラミング環境智啓 出川
 
20160728 hyperscale #03
20160728 hyperscale #0320160728 hyperscale #03
20160728 hyperscale #03ManaMurakami1
 
Pythonによる並列プログラミング -GPGPUも-
Pythonによる並列プログラミング   -GPGPUも- Pythonによる並列プログラミング   -GPGPUも-
Pythonによる並列プログラミング -GPGPUも- Yusaku Watanabe
 
【SQiP2014】システム操作インターフェイス最適化によるテスト自動化ROI向上
【SQiP2014】システム操作インターフェイス最適化によるテスト自動化ROI向上【SQiP2014】システム操作インターフェイス最適化によるテスト自動化ROI向上
【SQiP2014】システム操作インターフェイス最適化によるテスト自動化ROI向上Tatsuya Ishikawa
 
分散メモリ環境におけるシェルスクリプトの高速化手法の提案
分散メモリ環境におけるシェルスクリプトの高速化手法の提案分散メモリ環境におけるシェルスクリプトの高速化手法の提案
分散メモリ環境におけるシェルスクリプトの高速化手法の提案Keisuke Umeno
 
「NVIDIA プロファイラを用いたPyTorch学習最適化手法のご紹介(修正前 typoあり)」
「NVIDIA プロファイラを用いたPyTorch学習最適化手法のご紹介(修正前 typoあり)」「NVIDIA プロファイラを用いたPyTorch学習最適化手法のご紹介(修正前 typoあり)」
「NVIDIA プロファイラを用いたPyTorch学習最適化手法のご紹介(修正前 typoあり)」ManaMurakami1
 
全部入り!WGPで高速JavaScript+HML5体験
全部入り!WGPで高速JavaScript+HML5体験全部入り!WGPで高速JavaScript+HML5体験
全部入り!WGPで高速JavaScript+HML5体験AdvancedTechNight
 
【Unite Tokyo 2019】運用中超大規模タイトルにおけるUnityアップデート課題の解決手法と事例
【Unite Tokyo 2019】運用中超大規模タイトルにおけるUnityアップデート課題の解決手法と事例【Unite Tokyo 2019】運用中超大規模タイトルにおけるUnityアップデート課題の解決手法と事例
【Unite Tokyo 2019】運用中超大規模タイトルにおけるUnityアップデート課題の解決手法と事例UnityTechnologiesJapan002
 
pi-1. プログラミング入門
pi-1. プログラミング入門pi-1. プログラミング入門
pi-1. プログラミング入門kunihikokaneko1
 

Similar to 研究生のためのC++ no.7 (20)

Windows HPC Server 講習会 第2回 開発編
Windows HPC Server 講習会 第2回 開発編Windows HPC Server 講習会 第2回 開発編
Windows HPC Server 講習会 第2回 開発編
 
TotalViewを使ったFOCUSスパコンでのデバッグ体験 2016
TotalViewを使ったFOCUSスパコンでのデバッグ体験 2016TotalViewを使ったFOCUSスパコンでのデバッグ体験 2016
TotalViewを使ったFOCUSスパコンでのデバッグ体験 2016
 
Windows PowerShell 2.0 の基礎知識
Windows PowerShell 2.0 の基礎知識Windows PowerShell 2.0 の基礎知識
Windows PowerShell 2.0 の基礎知識
 
「NVIDIA プロファイラを用いたPyTorch学習最適化手法のご紹介(修正版)」
「NVIDIA プロファイラを用いたPyTorch学習最適化手法のご紹介(修正版)」「NVIDIA プロファイラを用いたPyTorch学習最適化手法のご紹介(修正版)」
「NVIDIA プロファイラを用いたPyTorch学習最適化手法のご紹介(修正版)」
 
20130126 sc12-reading
20130126 sc12-reading20130126 sc12-reading
20130126 sc12-reading
 
Capistranoで自動デプロイ
Capistranoで自動デプロイCapistranoで自動デプロイ
Capistranoで自動デプロイ
 
2015年度GPGPU実践プログラミング 第3回 GPGPUプログラミング環境
2015年度GPGPU実践プログラミング 第3回 GPGPUプログラミング環境2015年度GPGPU実践プログラミング 第3回 GPGPUプログラミング環境
2015年度GPGPU実践プログラミング 第3回 GPGPUプログラミング環境
 
20160728 hyperscale #03
20160728 hyperscale #0320160728 hyperscale #03
20160728 hyperscale #03
 
Jspmとtypescriptで開発する
Jspmとtypescriptで開発するJspmとtypescriptで開発する
Jspmとtypescriptで開発する
 
Pythonによる並列プログラミング -GPGPUも-
Pythonによる並列プログラミング   -GPGPUも- Pythonによる並列プログラミング   -GPGPUも-
Pythonによる並列プログラミング -GPGPUも-
 
【SQiP2014】システム操作インターフェイス最適化によるテスト自動化ROI向上
【SQiP2014】システム操作インターフェイス最適化によるテスト自動化ROI向上【SQiP2014】システム操作インターフェイス最適化によるテスト自動化ROI向上
【SQiP2014】システム操作インターフェイス最適化によるテスト自動化ROI向上
 
Chef
ChefChef
Chef
 
秒速ChainerMN
秒速ChainerMN秒速ChainerMN
秒速ChainerMN
 
Apache geode at-s1p
Apache geode at-s1pApache geode at-s1p
Apache geode at-s1p
 
分散メモリ環境におけるシェルスクリプトの高速化手法の提案
分散メモリ環境におけるシェルスクリプトの高速化手法の提案分散メモリ環境におけるシェルスクリプトの高速化手法の提案
分散メモリ環境におけるシェルスクリプトの高速化手法の提案
 
Papi
PapiPapi
Papi
 
「NVIDIA プロファイラを用いたPyTorch学習最適化手法のご紹介(修正前 typoあり)」
「NVIDIA プロファイラを用いたPyTorch学習最適化手法のご紹介(修正前 typoあり)」「NVIDIA プロファイラを用いたPyTorch学習最適化手法のご紹介(修正前 typoあり)」
「NVIDIA プロファイラを用いたPyTorch学習最適化手法のご紹介(修正前 typoあり)」
 
全部入り!WGPで高速JavaScript+HML5体験
全部入り!WGPで高速JavaScript+HML5体験全部入り!WGPで高速JavaScript+HML5体験
全部入り!WGPで高速JavaScript+HML5体験
 
【Unite Tokyo 2019】運用中超大規模タイトルにおけるUnityアップデート課題の解決手法と事例
【Unite Tokyo 2019】運用中超大規模タイトルにおけるUnityアップデート課題の解決手法と事例【Unite Tokyo 2019】運用中超大規模タイトルにおけるUnityアップデート課題の解決手法と事例
【Unite Tokyo 2019】運用中超大規模タイトルにおけるUnityアップデート課題の解決手法と事例
 
pi-1. プログラミング入門
pi-1. プログラミング入門pi-1. プログラミング入門
pi-1. プログラミング入門
 

研究生のためのC++ no.7