SlideShare a Scribd company logo
不遇の標準ライブラリ
歌舞伎座.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円!

More Related Content

What's hot

冬のLock free祭り safe
冬のLock free祭り safe冬のLock free祭り safe
冬のLock free祭り safeKumazaki Hiroki
 
中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr
Genya Murakami
 
今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips
Takaaki Suzuki
 
Rustに触れて私のPythonはどう変わったか
Rustに触れて私のPythonはどう変わったかRustに触れて私のPythonはどう変わったか
Rustに触れて私のPythonはどう変わったか
ShunsukeNakamura17
 
高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装
MITSUNARI Shigeo
 
いまさら聞けないarmを使ったNEONの基礎と活用事例
いまさら聞けないarmを使ったNEONの基礎と活用事例いまさら聞けないarmを使ったNEONの基礎と活用事例
いまさら聞けないarmを使ったNEONの基礎と活用事例
Fixstars Corporation
 
中3女子でもわかる constexpr
中3女子でもわかる constexpr中3女子でもわかる constexpr
中3女子でもわかる constexpr
Genya Murakami
 
Constexpr 中3女子テクニック
Constexpr 中3女子テクニックConstexpr 中3女子テクニック
Constexpr 中3女子テクニックGenya Murakami
 
Rolling hash
Rolling hashRolling hash
20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン
yohhoy
 
プログラムの処方箋~健康なコードと病んだコード
プログラムの処方箋~健康なコードと病んだコードプログラムの処方箋~健康なコードと病んだコード
プログラムの処方箋~健康なコードと病んだコード
Shigenori Sagawa
 
勉強か?趣味か?人生か?―プログラミングコンテストとは
勉強か?趣味か?人生か?―プログラミングコンテストとは勉強か?趣味か?人生か?―プログラミングコンテストとは
勉強か?趣味か?人生か?―プログラミングコンテストとはTakuya Akiba
 
暗号技術の実装と数学
暗号技術の実装と数学暗号技術の実装と数学
暗号技術の実装と数学
MITSUNARI Shigeo
 
何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門
masayoshi takahashi
 
初心者向けCTFのWeb分野の強化法
初心者向けCTFのWeb分野の強化法初心者向けCTFのWeb分野の強化法
初心者向けCTFのWeb分野の強化法
kazkiti
 
計算機アーキテクチャを考慮した高能率画像処理プログラミング
計算機アーキテクチャを考慮した高能率画像処理プログラミング計算機アーキテクチャを考慮した高能率画像処理プログラミング
計算機アーキテクチャを考慮した高能率画像処理プログラミング
Norishige Fukushima
 
君はyarn.lockをコミットしているか?
君はyarn.lockをコミットしているか?君はyarn.lockをコミットしているか?
君はyarn.lockをコミットしているか?
Teppei Sato
 
分散システムについて語らせてくれ
分散システムについて語らせてくれ分散システムについて語らせてくれ
分散システムについて語らせてくれ
Kumazaki Hiroki
 
いまさら聞けない!CUDA高速化入門
いまさら聞けない!CUDA高速化入門いまさら聞けない!CUDA高速化入門
いまさら聞けない!CUDA高速化入門
Fixstars Corporation
 
DockerコンテナでGitを使う
DockerコンテナでGitを使うDockerコンテナでGitを使う
DockerコンテナでGitを使う
Kazuhiro Suga
 

What's hot (20)

冬のLock free祭り safe
冬のLock free祭り safe冬のLock free祭り safe
冬のLock free祭り safe
 
中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr
 
今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips
 
Rustに触れて私のPythonはどう変わったか
Rustに触れて私のPythonはどう変わったかRustに触れて私のPythonはどう変わったか
Rustに触れて私のPythonはどう変わったか
 
高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装
 
いまさら聞けないarmを使ったNEONの基礎と活用事例
いまさら聞けないarmを使ったNEONの基礎と活用事例いまさら聞けないarmを使ったNEONの基礎と活用事例
いまさら聞けないarmを使ったNEONの基礎と活用事例
 
中3女子でもわかる constexpr
中3女子でもわかる constexpr中3女子でもわかる constexpr
中3女子でもわかる constexpr
 
Constexpr 中3女子テクニック
Constexpr 中3女子テクニックConstexpr 中3女子テクニック
Constexpr 中3女子テクニック
 
Rolling hash
Rolling hashRolling hash
Rolling hash
 
20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン
 
プログラムの処方箋~健康なコードと病んだコード
プログラムの処方箋~健康なコードと病んだコードプログラムの処方箋~健康なコードと病んだコード
プログラムの処方箋~健康なコードと病んだコード
 
勉強か?趣味か?人生か?―プログラミングコンテストとは
勉強か?趣味か?人生か?―プログラミングコンテストとは勉強か?趣味か?人生か?―プログラミングコンテストとは
勉強か?趣味か?人生か?―プログラミングコンテストとは
 
暗号技術の実装と数学
暗号技術の実装と数学暗号技術の実装と数学
暗号技術の実装と数学
 
何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門
 
初心者向けCTFのWeb分野の強化法
初心者向けCTFのWeb分野の強化法初心者向けCTFのWeb分野の強化法
初心者向けCTFのWeb分野の強化法
 
計算機アーキテクチャを考慮した高能率画像処理プログラミング
計算機アーキテクチャを考慮した高能率画像処理プログラミング計算機アーキテクチャを考慮した高能率画像処理プログラミング
計算機アーキテクチャを考慮した高能率画像処理プログラミング
 
君はyarn.lockをコミットしているか?
君はyarn.lockをコミットしているか?君はyarn.lockをコミットしているか?
君はyarn.lockをコミットしているか?
 
分散システムについて語らせてくれ
分散システムについて語らせてくれ分散システムについて語らせてくれ
分散システムについて語らせてくれ
 
いまさら聞けない!CUDA高速化入門
いまさら聞けない!CUDA高速化入門いまさら聞けない!CUDA高速化入門
いまさら聞けない!CUDA高速化入門
 
DockerコンテナでGitを使う
DockerコンテナでGitを使うDockerコンテナでGitを使う
DockerコンテナでGitを使う
 

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

リテラル文字列型までの道
リテラル文字列型までの道リテラル文字列型までの道
リテラル文字列型までの道Satoshi Sato
 
Stan勉強会資料(前編)
Stan勉強会資料(前編) Stan勉強会資料(前編)
Stan勉強会資料(前編)
daiki hojo
 
HTMLからの本文抽出
HTMLからの本文抽出HTMLからの本文抽出
HTMLからの本文抽出
Lintaro Ina
 
すごいHaskell読書会 in 大阪 #4 「第6章 モジュール」
すごいHaskell読書会 in 大阪 #4 「第6章 モジュール」すごいHaskell読書会 in 大阪 #4 「第6章 モジュール」
すごいHaskell読書会 in 大阪 #4 「第6章 モジュール」Shin Ise
 
AtCoder Beginner Contest 007 解説
AtCoder Beginner Contest 007 解説AtCoder Beginner Contest 007 解説
AtCoder Beginner Contest 007 解説
AtCoder Inc.
 
Xbyakの紹介とその周辺
Xbyakの紹介とその周辺Xbyakの紹介とその周辺
Xbyakの紹介とその周辺
MITSUNARI Shigeo
 
JavaScriptクイックスタート
JavaScriptクイックスタートJavaScriptクイックスタート
JavaScriptクイックスタート
Shumpei Shiraishi
 
Tokyo r38
Tokyo r38Tokyo r38
Tokyo r38
Takashi Minoda
 
最近の単体テスト
最近の単体テスト最近の単体テスト
最近の単体テスト
Ken Morishita
 
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
Hiromi Ishii
 
Web本文抽出 using crf
Web本文抽出 using crfWeb本文抽出 using crf
Web本文抽出 using crfShuyo Nakatani
 
CRF を使った Web 本文抽出
CRF を使った Web 本文抽出CRF を使った Web 本文抽出
CRF を使った Web 本文抽出
Shuyo Nakatani
 
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるC++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISる
Hideyuki Tanaka
 
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
 
AtCoder Beginner Contest 012 解説
AtCoder Beginner Contest 012 解説AtCoder Beginner Contest 012 解説
AtCoder Beginner Contest 012 解説
AtCoder Inc.
 
Sphinx HTML Theme Hacks
Sphinx HTML Theme HacksSphinx HTML Theme Hacks
Sphinx HTML Theme Hacks
Shoji KUMAGAI
 
⑯jQueryをおぼえよう!その2
⑯jQueryをおぼえよう!その2⑯jQueryをおぼえよう!その2
⑯jQueryをおぼえよう!その2
Nishida Kansuke
 

Similar to 不遇の標準ライブラリ - 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章 モジュール」
 
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 本文抽出
 
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるC++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISる
 
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