SlideShare ist ein Scribd-Unternehmen logo
1 von 36
Downloaden Sie, um offline zu lesen
不遇の標準ライブラリ
歌舞伎座.tech#8「C++初心者会」
@Ryosuke839
自己紹介
• @Ryosuke839
• 某工大情報工学科4年生です
• 画像認識の研究始めました
• C++初心者です
– 規格書暗記してません
– コンパイラのバグ踏んだことありません
• (‘ω’)
今回のテーマ
今回のテーマ
標準ライブラリ
今回のテーマ
標準ライブラリ
今回のテーマ
• 不遇の標準ライブラリ
今回のテーマ
• 不遇の標準ライブラリ
• 次期規格で追加されるライブラリなどのstate
of the artな話題ではありません
• C++98(C++の初期規格)から存在するライブラ
リの話です
– C++に詳しい諸兄はタイトルでピンときているはず
今回のテーマ
• valarray
• C++98から存在します
• 単独でヘッダファイルも持っています
– #include <valarray>
• でも使われてません
今回のテーマ
• valarray
• 数値計算に特化した可変長配列を実現する
テンプレートクラスvalarrayを含んでいます
– vectorと被るような…
• ベクトル演算を簡単に記述できます
• でも使われてません
今回のテーマ
• valarray
• どれだけ使われていないか
• 論文の世界では被引用数が論文の価値の目
安になるらしいので、被include数を示します
被include数@GitHub
100K
1M
10M
100M
被include数@GitHub
100K
1M
10M
100M
これ
被include数@GitHub
0
5M
10M
15M
20M
25M
これ
今回のテーマ
• valarray
• これだけ使われていないのはかわいそう
• 今回は(無理して)使ってみます
– 見た目でわかりやすい画像処理をします
使ってみる
• とりあえずIOを書きます
std::ifstream ifs(name, std::ios::binary);
std::valarray<unsigned char> res;
res.resize(256 * 256);
for (auto& c : res)
ifs.read(reinterpret_cast<char*>(&c), 1);
std::ofstream ofs(name, std::ios::binary);
for (auto& c : data)
ofs.write(reinterpret_cast<const char*>(&c), 1);
使ってみる
• とりあえずIOを書きます
std::ifstream ifs(name, std::ios::binary);
std::valarray<unsigned char> res;
res.resize(256 * 256);
for (auto& c : res)
ifs.read(reinterpret_cast<char*>(&c), 1);
std::ofstream ofs(name, std::ios::binary);
for (auto& c : data)
ofs.write(reinterpret_cast<const char*>(&c), 1);
可変長だけど可変長じゃない!
使ってみる
• あとは処理を書くだけ
auto data = readimg("nico.bmp");
data = (unsigned char)(192) - data / (unsigned char)(2);
writeimg("result.bmp", data);
使ってみる
• あとは処理を書くだけ
auto data = readimg("nico.bmp");
data = (unsigned char)(192) - data / (unsigned char)(2);
writeimg("result.bmp", data);
暗黙の変換はしてくれません
使ってみる
• あとは処理を書くだけ
auto data = readimg("nico.bmp");
data = (unsigned char)(192) - data / (unsigned char)(2);
writeimg("result.bmp", data);
使ってみる
• あとは処理を書くだけ
auto data = readimg("nico.bmp");
data = (unsigned char)(192) - data / (unsigned char)(2);
writeimg("result.bmp", data);
使ってみる
• Sliceも取れます
auto data = readimg("nico.bmp");
data[std::gslice(112 * 256 + 24,
std::valarray<size_t>{32, 160},
std::valarray<size_t>{256, 1})] = (unsigned char)(0);
writeimg("result.bmp", data);
使ってみる
• Sliceも取れます
auto data = readimg("nico.bmp");
data[std::gslice(112 * 256 + 24,
std::valarray<size_t>{32, 160},
std::valarray<size_t>{256, 1})] = (unsigned char)(0);
writeimg("result.bmp", data);
使ってみる
• 比較結果でsliceを作ることもできます
auto data = readimg("nico.bmp");
data[std::gslice(...)] = (unsigned char)(0);
auto text = readimg("text.bmp");
data[text != byte(127)] =
std::valarray<byte>(text[text != byte(127)]);
writeimg("result.bmp", data);
使ってみる
• 比較結果でsliceを作ることもできます
auto data = readimg("nico.bmp");
data[std::gslice(...)] = (unsigned char)(0);
auto text = readimg("text.bmp");
data[text != byte(127)] =
std::valarray<byte>(text[text != byte(127)]);
writeimg("result.bmp", data);
その他の用法
• 内積
• 外積
• ノルム
– L1
– L2
– L∞
(a * b).sum()
a.cshift(1) * b.cshift(-1) - a.cshift(-1) * b.cshift(1)
std::sqrt((a * a).sum())
std::abs(a).sum()
std::abs(a).max()
残念な仕様
• 他にもsin, cos, exp, log等の関数を使えます
– この場合でも引数と戻り値の型は同じです
– 他の型のvalarrayにキャストもできません
• Sliceで元のvalarrayへの参照を取れますが、
sliceのsliceを取ることはできません
– 一旦sliceから新しいvalarrayを生成する必要あり
template<class T> valarray<T> valarray<T>::apply(T func(const T&)) const;
template<class T> valarray<T> operator* (const valarray<T>&, const T&);
template<class T> valarray<T> pow(const valarray<T>&, const valarray<T>&);
残念な仕様
• valarrayがC++に導入されたそもそもの経緯
– C++が開発された80年代はベクトル型計算機の
華の時代
– Fortranではベクトル化最適化が実装されていた
残念な仕様
• valarrayがC++に導入されたそもそもの経緯
– C++が開発された80年代はベクトル型計算機の
華の時代
– Fortranではベクトル化最適化が実装されていた
– C++でもFortran並みの最適化を簡単に実現でき
るよう狙った?[要出典]
– 型の制約がきついのも最適化のため?[要出典]
残念な仕様
• 現在はPC向けCPUでもSSEなどのベクトル命
令が実装されている
– では、valarrayもそれらに最適化されるのでは…?
残念な仕様
• 現在はPC向けCPUでもSSEなどのベクトル命
令が実装されている
– では、valarrayもそれらに最適化されるのでは…?
• ベンチマークしてみます
– Cスタイルの配列とforループ
– std::vectorとstd::transform
– std::valarray
ベンチマーク
gcc clang
array +
for loop
606ms
FPU
660ms
SSE2
vector +
algorithm
603ms
FPU
641ms
SSE2
valarray 603ms
FPU
648ms
SSE2
Add, mul, sum, sqrt, sin, maxを求めるコード
いずれのコンパイラにも高速演算オプション適用
ベンチマーク
gcc clang msvc
array +
for loop
606ms
FPU
660ms
SSE2
vector +
algorithm
603ms
FPU
641ms
SSE2
281ms
SSE2
valarray 603ms
FPU
648ms
SSE2
256ms
SSE2
Add, mul, sum, sqrt, sin, maxを求めるコード
いずれのコンパイラにも高速演算オプション適用
ベンチマーク
gcc clang msvc icc icc+ipp
array +
for loop
606ms
FPU
660ms
SSE2
vector +
algorithm
603ms
FPU
641ms
SSE2
281ms
SSE2
184ms
AVX
valarray 603ms
FPU
648ms
SSE2
256ms
SSE2
45ms
AVX
41ms
AVX(ipp)
Add, mul, sum, sqrt, sin, maxを求めるコード
いずれのコンパイラにも高速演算オプション適用
ベンチマーク
gcc clang msvc icc icc+ipp
array +
for loop
606ms
FPU
660ms
SSE2
47ms
SSE4
27ms
AVX
vector +
algorithm
603ms
FPU
641ms
SSE2
281ms
SSE2
184ms
AVX
valarray 603ms
FPU
648ms
SSE2
256ms
SSE2
45ms
AVX
41ms
AVX(ipp)
Add, mul, sum, sqrt, sin, maxを求めるコード
いずれのコンパイラにも高速演算オプション適用
まとめ
• valarrayは使われてない割には便利です!
– 簡単なベクトル演算をしたい時に俺々ライブラリ
を書くよりはずっと便利 ただし謎の制約多数
– 仕様が独特なので、本格的な演算をしたい場合
は本格的なライブラリを使いましょう
• vector以上に最適化が効きます
• iccでコンパイルするとvectorの数倍速いです
まとめ
• valarrayは使われてない割には便利です!
– 簡単なベクトル演算をしたい時に俺々ライブラリ
を書くよりはずっと便利 ただし謎の制約多数
– 仕様が独特なので、本格的な演算をしたい場合
は本格的なライブラリを使いましょう
• vector以上に最適化が効きます
• iccでコンパイルするとvectorの数倍速いです
– インテルのコンパイラ今日限り特価140,000円!

Weitere ähnliche Inhalte

Was ist angesagt?

Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Preferred Networks
 
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだconstexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
Genya Murakami
 
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由
kikairoya
 
組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門
Norishige Fukushima
 
勉強か?趣味か?人生か?―プログラミングコンテストとは
勉強か?趣味か?人生か?―プログラミングコンテストとは勉強か?趣味か?人生か?―プログラミングコンテストとは
勉強か?趣味か?人生か?―プログラミングコンテストとは
Takuya Akiba
 

Was ist angesagt? (20)

色々なダイクストラ高速化
色々なダイクストラ高速化色々なダイクストラ高速化
色々なダイクストラ高速化
 
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
 
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだconstexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
 
競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性
 
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由
 
Re永続データ構造が分からない人のためのスライド
Re永続データ構造が分からない人のためのスライドRe永続データ構造が分からない人のためのスライド
Re永続データ構造が分からない人のためのスライド
 
組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門
 
充足可能性問題のいろいろ
充足可能性問題のいろいろ充足可能性問題のいろいろ
充足可能性問題のいろいろ
 
中3女子でもわかる constexpr
中3女子でもわかる constexpr中3女子でもわかる constexpr
中3女子でもわかる constexpr
 
指数時間アルゴリズム入門
指数時間アルゴリズム入門指数時間アルゴリズム入門
指数時間アルゴリズム入門
 
いまさら聞けない!CUDA高速化入門
いまさら聞けない!CUDA高速化入門いまさら聞けない!CUDA高速化入門
いまさら聞けない!CUDA高速化入門
 
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるC++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISる
 
純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門
 
Binary indexed tree
Binary indexed treeBinary indexed tree
Binary indexed tree
 
文字列アルゴリズム
文字列アルゴリズム文字列アルゴリズム
文字列アルゴリズム
 
二分探索法で作る再帰呼び出しできるCプリプロセッサマクロ
二分探索法で作る再帰呼び出しできるCプリプロセッサマクロ二分探索法で作る再帰呼び出しできるCプリプロセッサマクロ
二分探索法で作る再帰呼び出しできるCプリプロセッサマクロ
 
高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装
 
Rolling hash
Rolling hashRolling hash
Rolling hash
 
AVX-512(フォーマット)詳解
AVX-512(フォーマット)詳解AVX-512(フォーマット)詳解
AVX-512(フォーマット)詳解
 
勉強か?趣味か?人生か?―プログラミングコンテストとは
勉強か?趣味か?人生か?―プログラミングコンテストとは勉強か?趣味か?人生か?―プログラミングコンテストとは
勉強か?趣味か?人生か?―プログラミングコンテストとは
 

Ähnlich wie 不遇の標準ライブラリ - valarray

リテラル文字列型までの道
リテラル文字列型までの道リテラル文字列型までの道
リテラル文字列型までの道
Satoshi Sato
 
すごいHaskell読書会 in 大阪 #4 「第6章 モジュール」
すごいHaskell読書会 in 大阪 #4 「第6章 モジュール」すごいHaskell読書会 in 大阪 #4 「第6章 モジュール」
すごいHaskell読書会 in 大阪 #4 「第6章 モジュール」
Shin Ise
 
Web本文抽出 using crf
Web本文抽出 using crfWeb本文抽出 using crf
Web本文抽出 using crf
Shuyo Nakatani
 
Scalaプログラミング・マニアックス
Scalaプログラミング・マニアックスScalaプログラミング・マニアックス
Scalaプログラミング・マニアックス
Tomoharu ASAMI
 
12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと
12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと 12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと
12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと
Haruka Ozaki
 

Ähnlich wie 不遇の標準ライブラリ - valarray (20)

リテラル文字列型までの道
リテラル文字列型までの道リテラル文字列型までの道
リテラル文字列型までの道
 
Stan勉強会資料(前編)
Stan勉強会資料(前編) Stan勉強会資料(前編)
Stan勉強会資料(前編)
 
HTMLからの本文抽出
HTMLからの本文抽出HTMLからの本文抽出
HTMLからの本文抽出
 
すごいHaskell読書会 in 大阪 #4 「第6章 モジュール」
すごいHaskell読書会 in 大阪 #4 「第6章 モジュール」すごいHaskell読書会 in 大阪 #4 「第6章 モジュール」
すごいHaskell読書会 in 大阪 #4 「第6章 モジュール」
 
中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr
 
AtCoder Beginner Contest 007 解説
AtCoder Beginner Contest 007 解説AtCoder Beginner Contest 007 解説
AtCoder Beginner Contest 007 解説
 
Xbyakの紹介とその周辺
Xbyakの紹介とその周辺Xbyakの紹介とその周辺
Xbyakの紹介とその周辺
 
JavaScriptクイックスタート
JavaScriptクイックスタートJavaScriptクイックスタート
JavaScriptクイックスタート
 
Tokyo r38
Tokyo r38Tokyo r38
Tokyo r38
 
最近の単体テスト
最近の単体テスト最近の単体テスト
最近の単体テスト
 
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
 
Web本文抽出 using crf
Web本文抽出 using crfWeb本文抽出 using crf
Web本文抽出 using crf
 
CRF を使った Web 本文抽出
CRF を使った Web 本文抽出CRF を使った Web 本文抽出
CRF を使った Web 本文抽出
 
Scalaプログラミング・マニアックス
Scalaプログラミング・マニアックスScalaプログラミング・マニアックス
Scalaプログラミング・マニアックス
 
C++11のつかいかた
C++11のつかいかたC++11のつかいかた
C++11のつかいかた
 
Haikara
HaikaraHaikara
Haikara
 
12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと
12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと 12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと
12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと
 
AtCoder Beginner Contest 012 解説
AtCoder Beginner Contest 012 解説AtCoder Beginner Contest 012 解説
AtCoder Beginner Contest 012 解説
 
Sphinx HTML Theme Hacks
Sphinx HTML Theme HacksSphinx HTML Theme Hacks
Sphinx HTML Theme Hacks
 
⑯jQueryをおぼえよう!その2
⑯jQueryをおぼえよう!その2⑯jQueryをおぼえよう!その2
⑯jQueryをおぼえよう!その2
 

不遇の標準ライブラリ - valarray