SlideShare a Scribd company logo
1 of 72
1
計算スケジューリングの効果
もし,Halideがなかったら?
名古屋工業大学
福嶋 慶繁
2
基本的なフィルタである2次元畳み込みで
あるガウシアンフィルタを対象
セパラブルフィルタで実装することで2段
のパイプラインの最適化の例を紹介
あとHalideの限界も
概要
3
フィルタを縦・横に分離するだけ
セパラブルフィルタ
*
2次元カーネル 水平カーネル垂直カーネル
垂直
水平
水平
垂直
※順序はどちらでもよい
4
Halideによる
計算スケジューリング
5
ここでは,記述されたアルゴリズムの計算結
果に影響なく*,どうやって計算するかを記述
したものと定義
–*ただし,浮動小数点の数値計算誤差を除く
並列計算の仕方
–マルチスレッド並列化
–ベクトル化
計算順序
–タイリング
–ループアンローリング
–データ構造変換
–縦→横か横→縦か?
計算スケジューリングとは
6
XYのフィルタ順序の入れ替え
– アルゴリズム相当なのでコードの書き替えがいる
vectorize
– ベクトル化とアンローリング
Parallelize
– 並列化
Tile
– タイリング
BoundaryConditions
– 境界条件処理
Reorder
– 順序変更
など
Halideの計算スケジューリング
7
Halideによる
境界条件処理
8
畳み込みフィルタの画像端は,画素が存在
しないため,特別な走査が必要
–存在しない画像をどのように扱うか?
境界条件処理とは
1. 計算しないように無視
画像端の画像が出力されない→×
2. 境界外はフィルタせずフィルタ範囲を縮小
フィルタ性能が劣化→×
3. 信号を折り返して作成
最もきれい.信号処理の基本はこれ→〇
※1,2の処理はフィルタを繰り返すと劣化部分が
拡散.拡散方程式を解くときも境界条件は重要
問題ない畳み込み
特別な処理が必要
9
実現するためには2通り
–事前に折り返した信号を画像端に追加し,画像
を拡張することで分岐処理を削除
–境界条件になるときに条件分岐をしながら信号
を計算で生成
信号を折り返して作成
画像拡張 (a) 縦横分岐有り
(b) 縦か横に分岐有り
(c) 分岐無し
(a) (a)
(a)(a)
(b)
(b)
(b) (b)(c)
中心部だけ処理
10
copyMakeBorderで画像を拡張
–BORDER_CONSTANT
`iiiiii|abcdefgh|iiiiiii` with some specified `i`
–BORDER_REPLICATE
`aaaaaa|abcdefgh|hhhhhhh`
–BORDER_REFLECT
`fedcba|abcdefgh|hgfedcb`
–BORDER_WRAP //なぜか実装されてない?
`cdefgh|abcdefgh|abcdefg`
–BORDER_REFLECT_101
`gfedcb|abcdefgh|gfedcba`
画像拡張( OpenCVの場合)
11
BoundaryConditions名前空間の関数を使用
–constant_exterior
–repeat_edge
–mirror_image
–mirror_interior
–repeat_image
Halideの場合
Buffer<float> input(width,height);
Func inputimg = BoundaryConditions::mirror_interior(input);
//これをスケジューリングに入れると事前に拡張画像を生成
inputimg.compute_root();
12
分岐が必要な位置に応じて画素アクセスをインライン
関数で記述(おそらくベクトル化されている)
image(j,i) ->image(border_s(j), borders_(i))など.
– BORDER_REPLICATE
int border_s(int val) { return cv::max(0, val); }
int border_e(int val, int maxval)
{ return cv::min(maxval, val); }
– cv::BORDER_REFLECT
int border_s(int val) { return (val>=0) ? val : -val-1; }
int border_e(int val, int maxval)
{ return (val <= maxval) ? val : 2*maxval- val + 1;}
– cv::BORDER_REFLECT101
int border_s(int val) { return cv::abs(val); }
int border_e(int val, int maxval)
{ return maxval- cv::abs(maxval-val); }
計算する場合
13
画像拡張
–画素アクセスに計算がない→load命令だけでよいた
めベクトル演算向き
–分岐処理ないため,コードの記述がすっきりする
–事前に少し大きなバッファを作成する必要がある
ためオーバーヘッドになる
計算
–事前バッファ生成が無いためオーバーヘッドがな
い
–分岐処理があるため,コードの記述が非常に長い
ベクトル演算が遅い(長すぎる...)
–画素アクセスに計算がある→load命令では不可能
(ベクトルアドレッシングを使えば計算は不要)
拡張 vs 計算
14
実装したHalideによる
計算スケジューリング
15
–COMPUTE_INLINE = 0,
–REORDER_YX,
–COMPUTE_ROOT_BORDER,
–COMPUTE_ROOT_FIRSTFILTER,
–COMPUTE_ROOT_FIRSTFILTER2,
–COMPUTE_ROOT_BORDER_TILE,
–COMPUTE_ROOT_BORDER_TILE2,
–COMPUTE_AT_TILE,
–COMPUTE_AT_STOTE_TILE,
–COMPUTE_ROOT_BORDER_AT_TILE,
–COMPUTE_ROOT_BORDER_AT_STOTE_TILE,
合計 180行
スケジューリング一覧
16コード(一部)
if (xyorder == 0)
{
blur1(x, y) = sum(weight(r)*inputimg(x + r, y));
blur2(x, y) = sum(weight(r)*blur1(x, y + r));
}
else if (xyorder == 1)
{
blur1(x, y) = sum(weight(r)*inputimg(x, y + r));
blur2(x, y) = sum(weight(r)*blur1(x + r, y));
}
//schedule
if (smethod == COMPUTE_INLINE)
{
blur2.vectorize(x, vectorl).parallel(y);
schedulename = "COMPUTE_INLINE";
}
else if (smethod == REORDER_YX)
{
blur2.reorder(y, x).vectorize(x, vectorl).parallel(y);
schedulename = "REORDER_YX";
}
else if (smethod == COMPUTE_ROOT_BORDER)
{...
17
512x512
–r=3
0.150 ms x3.1 OpenCV
–R=50
1.5 ms x3.87 OpenCV
4096x2048
–R=3
25.6 ms x0.39 OpenCV
–R=50
101 ms x1.53 OpenCV
結果
18demo
19
JITコンパイラがいつも走る
–同じ式なら1度しか走らないのに...
–なんで?
–入力画像のポインタ位置も式に入っていると気
づくまで5時間くらいかかった..
BoundaryConditionsの謎挙動
–上に合わせて,rが大きいときにx,yではな
くてy,xのループのほうが速いという新事実
vectorize(x,8).parallel(x) よりも
reorder.(x,y).vectorize(y,8).parallel(x) が速い
–なにがおかしいか発見するのが遅くなった.
Halide書いてた時のトラップ
20
非常に短い行数で様々なスケジューリング
ができた.
OpenCVよりも高速化することが簡単にで
きた.
–一部例外を除く
まとめ
21
C++でも書いてみた.
Halide同じことができるかもしれないし,できないかもしれない
(検証が追い付いてません)
22
ラインバッファ
1. filterHVLine
2. filterHVLineBH 前拡
3. filterHVLineBVP 後拡・VP
4. filterHVLineHBVPB 前拡・後拡・VP
5. filterVHLine
6. filterVHLineBVP 前拡・VP
7. filterVHLineBH 後拡
8. filterVHLineBVPBH 前拡・VP・後拡
9. filterHVILine
10. filterHVILineB 後拡
11. filterVHILine
12. filterVHILineB 後拡
イメージバッファ
13. filterHVImage
14. filterHVImageBH 前拡
15. filterHVImageBHD 前拡・遅延
16. filterHVImageBHBV 前拡・後拡
17. filterHVImageBHDBV 前拡・遅延・後拡
18. filterHVImageBVP 後拡・VP
19. filterHVImageBHBVP 前拡・後拡・VP
20. filterHVImageBHDBVP 前拡・遅延・後拡・VP
21. filterHVImageTrB 転書・後拡
22. filterHVImageBHBTr 前拡・転書・後拡
23. filterVHImage
実装した関数一覧
24. filterVHImageBV 前拡
25. filterVHImageBH 後拡
26. filterVHImageBVBH 前拡・後拡
27. filterVHImageBVP 前拡・VP
28. filterVHImageBVPBH 前拡・VP・後拡
29. filterHVIImage
30. filterVHIImage
31. filterVHIImageBH 後拡
32. filterVHIImageBVBH 前拡・後拡
タイルバッファ
33. filterHVTileImage
34. filterHVTileImageBH 前拡
35. filterHVTileImageBHTr 前拡・転書
36. filterHVTileImageTr 転書
37. filterHVTileImageT2 転書ver2
38. filterVHTileImage
39. filterVHTileImageBH 前拡
40. filterVHTileImageBV 前拡
41. filterVHITileLineBH 前拡
42. filterVHITileImageBV 前拡
43. filterHVITileLine
拡張イメージバッファ
44. filterHVBorder 全拡
45. filterVHBorder 全拡
46. filterHVDelayedBorder 全拡・遅延
47. filterHVDelayedVPBorder 全拡・VP・遅延
48. filterVHDelayedBorder 全拡・遅延
49. filterHVIBorder 全拡
50. filterVHIBorder 全拡
51. filterHVTileBorder 全拡
52. filterVHTileBorder 全拡
53. filterVHITileBorder 全拡
54. filterHVITileBorder 全拡
サブイメージ配列バッファ
55. filterHVBorderSingle 全拡
56. filterVHBorderSingle 全拡
57. filterHVIBorderSingle 全拡
58. filterVHIBorderSingle 全拡
59. filterHVDelayedBorderSingle 全拡・遅延
60. filterHVDelayedVPBorderSingle 全拡・遅延・VP
61. filterVHDelayedBorderSingle 全拡・遅延
62. filterVHVPBorderSingle 前拡・VP
63. filterCopyBorderSingle
64. filterTileSubImage
65. filterTileSubImageInplace
23
フィルタ順序
–XYインタリーブ
ボーダーの扱い
–拡張なし
–事前に全拡張
–1パス目事前拡張・
2パス目事前拡張
–2パス目事前拡張
–サブ画像事前生成
(事前タイリング)
更に考慮したもの
バッファの確保
– インプレース
– 事前確保
– 事後確保
バッファの種類
– ラインバッファ
– イメージバッファ
– 拡張画像バッファ
– タイルバッファ
– タイルラインバッファ
その他
– 列パッキング
– 転置書き込み
– 遅延書き込み
– ボーダー計算のベクトルアド
レッシング
24
計算スケジューリング
25
Hフィルタ→Vフィルタ
Vフィルタ→Hフィルタ
HVインタリーブ
VHインタリーブ
フィルタ順序
26計算順序の種類
横→縦
(HV)
縦→横
(VH)
横縦イン
タリーブ
(HVI)
縦横イン
タリーブ
(VHI)
...
...
...
27
インタリーブ処理をするとスキャン順序に
制約が生じる
横→縦インタリーブ
–強制非ラスタスキャン
横→縦インタリーブ
–強制ラスタスキャン
必要なバッファはラインバッファに限定さ
れる.
–1ラインの縦フィルタをラインバッファに収め
て,そのラインバッファを横フィルタ
フィルタ順序とスキャン順序
28
境界条件処理
29
普段
境界領域 (replicate)
アクセス位置の計算
img(min(i+k+0,0), min(i+k+1), min(i+k+2), min(i+k+3));
float[4] pos={i+k+0, i+k+1, i+k+2, i+k+3};
__m128 pos2 _mm_min_ps((__m128)pos, _mm_setzero_ps());
_mm_store_ps(pos, pos2);
_mm_load_ps(_mm_set_ps(img[pos[0]], img[pos[1]], img[pos[2]], img[pos[3]]));
img(i+k+0, i+k+1, i+k+2, i+k+3);
_mm_load_ps(img+i+k);
30
テーブルで指示された非連続的なデータの
ロード・ストア実行する
–それぞれgather,scatter命令
値をひとつづつsetするよりは非常に高速
–ひと昔前のgather命令はすこし遅い
複雑な画素アクセスやテーブル参照がベク
トル演算で記述できるように!
ベクトルアドレッシング
int [4] pos={i+k+0, i+k+1, i+k+2, i+k+3};
__m128i pos2 _mm_min_si128((__m128i)pos, _mm_setzero_si128());
_mm_i64gather_epi32(img, pos, 4);
31
画素境界でアクセスするパターンは参照位
置と拡張方法で一意に決定.
–テーブル化可能
アクセスパターンのテーブル化
int table [N][4] ={i+k+0, i+k+1, i+k+2, i+k+3}
n=0;//n番目のパターン
_mm_i64gather_epi32(img, table[n], 4);
32画像端ベクトルアドレッシング
画像
ベクトル参照
画像
ベクトル参照
アクセスパターンを作ってgather
通常のアクセス
またぐ場合のアクセス
gather ではなくてshuffleとpermuteで作ってもいいけど,コード量が...
33
折り返したロード処理は,リバースでロー
ドするだけ
画像端をベクトルがまたぐ時だけ詳細に考
えればよい
境界のベクトルアクセス
画像端外の位置のロードは
画像内のどこかのロード
画像端
画像端をまたぐ
ロードだけ考慮
34はみ出るのは最大でもrだけ
画像
ここのアクセスパターンが必要
畳み込み範囲
画像
ここのアクセスパターンが必要
畳み込み範囲
最大rだけベクトルアドレッシングを行い,残りは普通の
ロードで可能:分量もr, r-1, …と減っていく
35境界領域計算のまとめ
(a) 縦横分岐有り
(b) 縦か横に分岐有り
(c) 分岐無し
(a) (a)
(a)(a)
(b)
(b)
(b) (b)(c)
Halideの実装(多分.要検証)
• a,b,cでループを分割
• a,bの領域はすべては折り返し用のアドレス演算を計算
• cはそもまま
今回の実装
• a,b,cでループを分割
• アドレス計算演算する領域を最小化
• (計算方法自体は,一応もう少し高速化できるがつらい...)
36
画像端とアクセスするベクトルがまたがっ
ている場合しかベクトルアドレッシングは
必要ない
リバースでloadできれば良い
–実装はshuffleとpermuteだけでOK
反対向きにロードする
__m256 a = _mm256_load_ps(s + i);
a = _mm256_shuffle_ps(a, a, _MM_SHUFFLE(0, 1, 2, 3));
a = _mm256_permute2f128_ps(a, a, 1);
_mm256_store_ps(d - i - 8, a);
画像
遠く離れた場所の参照
折り返し
37
バッファの取り方
38
フィルタの最小バッファサイズ
–入力画像のサイズ1つ
–出力画像のサイズ1つ
必要バッファ
セパラブルフィルタはバッファが必ず必要
sum = 0;
sum += Σk I(y-1,x-k);
sum += Σk I(y+0,x-k);
sum += Σk I(y+1,x-k);
ココを
計算
加算
計算結果を保持する場所がないため,毎画素
水平方向の畳み込みを再計算→O(r2)と同じ
書き込み
39
計算結果格納用バッファ追加
–入力画像のサイズ1つ
–出力画像のサイズ1つ
–中間画像のサイズ1つ
必要バッファ
val = Σk I(y,x-k);
ココを
計算
計算結果を保持する場所がないため,毎画素
水平方向の畳み込みを計算→O(r2)と同じ
書き込み
中間画像
40
計算結果格納用バッファ追加
–入力画像のサイズ1つ
–出力画像のサイズ1つ
–中間画像のサイズ1つ
必要バッファ
水平の畳み込み結果は再利用可能
val = Σk I(y-k,x);
ココを
計算
水平方向の畳み込みを保持することで再利用
して計算オーダーがO(r)に!
書き込み
中間画像
41
最小バッファ構成
–入力画像のサイズ1つ
–出力画像のサイズ1つ
–ラインバッファ1つ
処理手順
–入力画像バッファを横フィルタして出力画像
バッファに
–出力画像バッファを縦方向にコピー
–ラインバッファを縦フィルタ(データはシーケ
ンシャルに)して,出力を縦方向にストア
(scatter)
必要バッファ
42処理手順
水平方向にフィルタ 縦方向にフィルタ結
果をラインバッファ
にコピー
縦方向にフィルタ(転置済
みのため横方向フィルタ相
当)したのちに,ライン
バッファにコピー
入力画像バッファ 出力画像バッファ 出力画像バッファラインバッファ
特徴
• 最小メモリ構成
• 縦方向にバッファをコピーするため,2段目の並列化が縦方向に
• 書き込みが縦方向のため,store不可.scatterがないと非ベクトルアクセス
• ラインバッファへのコピー処理が無駄
43
イメージバッファ
ラインバッファ
拡張画像バッファ
タイルバッファ
サブイメージ配列バッファ
バッファの種類
44イメージバッファ
バッファ1つ.境界領域の画素参照をすべて計算
する必要がある.
入力B 出力B画像B
フィルタ1 フィルタ2
45イメージバッファ(inplace)
イメージバッファに結果を書きだすため,出力
バッファを入力バッファに変えるinplace関数にし
ても問題ない
入力B 入力B画像B
フィルタ1 フィルタ2
46イメージバッファ
フィルタ1の
この部分の処
理が省略可能
バッファの実態を水平・垂直に
拡張したものを確保しておき,
先頭ポインタをずらして使って,
遅延書き込みすることによって
拡張バッファは1つにすること
も可
入力B
フィルタ1画像拡張 フィルタ2
出力B拡張B1 拡張B2
47イメージバッファ(転置)
入力B 出力B画像B
フィルタ1 フィルタ2
読み込みを水平,書き込みを垂直に行うと,次段が垂直フィ
ルタであれば,畳み込みが効率化.結果の出力はその逆を行
う.ただし,書き込みが通常よりも重たくなる.
読み書きと同時に実行するため,書き込み→転置よりは速い.
48ラインバッファ
入力B
フィルタ1 フィルタ2
出力B出力B ラインB
コピー
• ラインバッファに入力画像をコピーして,ラインバッ
ファをフィルタして,結果を出力バッファに書き込む.
• インプレース処理可能
コピー
繰返し 繰返し
49ラインバッファ1つに
入力B
フィルタ1 フィルタ2
出力B出力B ラインB
コピー
• 出力バッファをテンポラリとして使うとバッファのコ
ピー回数が減る.
• インプレース処理が不可
50
垂直の連続画素を切り出して水平のベクト
ルへ転置すると,垂直方向の画素アクセス
が局所化
–カーネル半径が大きい場合に高速化が期待
ベクトル転置
51
拡張したラインバッファを保持し,中央部
にコピーしたのちに拡張処理をする.
ラインバッファは,どうせコピーするので
ほぼノーコストでフィルタリングが高速化
–画像拡張の処理面積は,コピーする面積に比べ
て圧倒的に小さい
ラインバッファ拡張
52拡張イメージバッファ
入力B
フィルタ1画像拡張 フィルタ2
出力B
遅延書き込みによって拡張バッファは1つにすることも可
拡張B1 拡張B2
例えば,初段に水平フィルタを行う場合,上下の
拡張部分にもフィルタをする必要がある.処理コ
スト増.ただし,2段目は不必要.
53通常のフィルタと書き込み
拡張済み画像
注目画素
畳み込み範囲
出力画像
拡張済み画像
出力画像
1画素目
2画素目
ここが更新済みだと困るため出力バッファは別に必要.
54遅延書き込み
拡張済み画像
注目画素
畳み込み範囲
出力画像
拡張済み画像
出力画像
1画素目
2画素目
インプレースで処理化.ただし次段が拡張領域を必要としない.
55
拡張画像はフィルタ半径分のバッファが前
方にあるため,その分ずらせば,フィルタ
範囲から外れた場所に必ず書き込める.
ただし,その方向には拡張済みのデータが
なくなること,末尾にごみが残る.
フィルタは2パス目に使用した拡張領域が
必要なくなるため効果的
遅延書き込み
56タイルバッファ
画像拡張 小画像を拡張画像
バッファとして処理
• 入力画像の処理ループを分割してタイリングして,タイル
バッファに出力.その後,タイルを出力に書き込み.
• 境界処理が発生する処理は冗長処理が必要
タイルB
57サブイメージバッファ
画像拡張 画像拡張をタイリングした
冗長な小画像をarrayに
小画像を拡張画像
バッファとして処理
• ループを分割してタイリングするよりも簡単に実装可能.
各サブイメージを並列に実行すれば並列化も容易.
• ただし,効率は落ちる.
• 2D畳み込みくらいならタイリングを自前で書くことはで
きても深いパイプラインをタイリングするのは無謀.
58
画像サイズが変わったか
–変わった場合はどうにもできない
フィルタ半径が変わったか
–拡張処理をしない場合はいろいろ再利用可能
インプレースか否か
–インプレースであればバッファが削減可能であ
ることが多い
バッファのその他考慮する点
59
ベクトル化方法
60水平フィルタのベクトル化1
水平4つの画素をまとめて3x1の畳み込み.(xのループでベクトル化)
畳み込みのループでベクトル化することも可能だが,ベクトル長が短い
61水平フィルタのベクトル化2
垂直方向にデータ依存性がある場合などはこれ.
垂直4つの画素をまとめて3x1の畳み込み.(xのループでベクトル化)
垂直ロードがないため,gatherなどで書くため非常に遅い
62垂直フィルタのベクトル化1
水平4つの画素をまとめて3x1の畳み込み.(xのループでベクトル化)
畳み込みのループでベクトル化することも可能だが,ベクトル長が短い
63垂直フィルタのベクトル化2
水平方向にデータ依存性がある場合などはこれ.
垂直4つの画素をまとめて1x3の畳み込み.(xのループでベクトル化)
垂直ロードがないため,gatherなどで書くため非常に遅い
64垂直フィルタのベクトル化3
画像を転置してしまえば水平が垂直に
転置処理が重たい.
65垂直フィルタのベクトル化2
垂直にデータをラインバッファにコピーしてから水平に処理.
シーケンシャルに処理できるため,フィルタだけは垂直にフィルタするよりも速い
全体に転置するよりもまし.
コピーするのと同時に画像拡張もやっても処理コストはほぼ同じ
コピー
66
実験および結果
67
512x512
– r=50
Halide 1.5ms (x3.87)
Myimp 0.92 (x6.25) (HV ImageB1DB2VP)
– r=3
Halide 0.150 (x3.1)
Myimp 0.056 (x8.30) (VHI LineB2)
4096x2048
– r=3
Halide 25.6ms (x0.39)
Myimp 4.04ms (x2.51) (VHI LineB2)
– r=50
Halide 101 ms (x1.53)
Myimp 33.58 ms (x4.61) (VH T2x8 Sub VP)
結果
68demo
69
Halide
–1時間程度
–180行
C++/AVX
–3週間(わりとフルコミット)
18,000行
時間(作るほう)
70
HalideでもOpenCVよりも十分速いコード
が生成可能
ものすごい手軽にそこそこ速いコードが生
成できた.
今後の課題
–もっとHalideはチューニングできるはず!
Halideで書いたコードのバッファの取り扱い方が甘
い.
50x50の畳み込みなどは細かな処理の影響は少
ないのにこんなに差が出るのはおかしい→なにか言
語に対する自分の理解がきっと間違ってる.
まとめ
71
普通の人は,車輪の再発明に3週間もフル
コミットしてはいけません.
–このあたりの話で論文を書くのでまじめに書き
ました.
ガウシアンフィルタは,基本的にはFIR畳み
込みをしてはいけません.
優れたアルゴリズムを使いましょう
–512x512程度なら,0.4ms程度で任意の畳み込み
半径で処理できます.
感想
72
論文書きました.
–Taxonomy of Vectorization Patterns of
Programming for FIR Image Filters Using
Kernel Subsampling and New One
–いろんな2D FIRフィルタを,考えられるベクト
ル化パターンですべてでSIMD実装して評価し
ました.
–これ,10万行くらいあります.
The experimental code reached around 100,000 lines.
http://www.mdpi.com/2076-3417/8/8/1235
宣伝

More Related Content

What's hot

ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門Fixstars Corporation
 
ソフト高速化の専門家が教える!AI・IoTエッジデバイスの選び方
ソフト高速化の専門家が教える!AI・IoTエッジデバイスの選び方ソフト高速化の専門家が教える!AI・IoTエッジデバイスの選び方
ソフト高速化の専門家が教える!AI・IoTエッジデバイスの選び方Fixstars Corporation
 
DSIRNLP #3 LZ4 の速さの秘密に迫ってみる
DSIRNLP #3 LZ4 の速さの秘密に迫ってみるDSIRNLP #3 LZ4 の速さの秘密に迫ってみる
DSIRNLP #3 LZ4 の速さの秘密に迫ってみるAtsushi KOMIYA
 
計算機アーキテクチャを考慮した高能率画像処理プログラミング
計算機アーキテクチャを考慮した高能率画像処理プログラミング計算機アーキテクチャを考慮した高能率画像処理プログラミング
計算機アーキテクチャを考慮した高能率画像処理プログラミングNorishige Fukushima
 
高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装MITSUNARI Shigeo
 
並列化による高速化
並列化による高速化 並列化による高速化
並列化による高速化 sakura-mike
 
Hopper アーキテクチャで、変わること、変わらないこと
Hopper アーキテクチャで、変わること、変わらないことHopper アーキテクチャで、変わること、変わらないこと
Hopper アーキテクチャで、変わること、変わらないことNVIDIA Japan
 
1076: CUDAデバッグ・プロファイリング入門
1076: CUDAデバッグ・プロファイリング入門1076: CUDAデバッグ・プロファイリング入門
1076: CUDAデバッグ・プロファイリング入門NVIDIA Japan
 
深層学習フレームワークにおけるIntel CPU/富岳向け最適化法
深層学習フレームワークにおけるIntel CPU/富岳向け最適化法深層学習フレームワークにおけるIntel CPU/富岳向け最適化法
深層学習フレームワークにおけるIntel CPU/富岳向け最適化法MITSUNARI Shigeo
 
ゼロから始める深層強化学習(NLP2018講演資料)/ Introduction of Deep Reinforcement Learning
ゼロから始める深層強化学習(NLP2018講演資料)/ Introduction of Deep Reinforcement Learningゼロから始める深層強化学習(NLP2018講演資料)/ Introduction of Deep Reinforcement Learning
ゼロから始める深層強化学習(NLP2018講演資料)/ Introduction of Deep Reinforcement LearningPreferred Networks
 
いまさら聞けないarmを使ったNEONの基礎と活用事例
いまさら聞けないarmを使ったNEONの基礎と活用事例いまさら聞けないarmを使ったNEONの基礎と活用事例
いまさら聞けないarmを使ったNEONの基礎と活用事例Fixstars Corporation
 
分散学習のあれこれ~データパラレルからモデルパラレルまで~
分散学習のあれこれ~データパラレルからモデルパラレルまで~分散学習のあれこれ~データパラレルからモデルパラレルまで~
分散学習のあれこれ~データパラレルからモデルパラレルまで~Hideki Tsunashima
 
HalideでつくるDomain Specific Architectureの世界
HalideでつくるDomain Specific Architectureの世界HalideでつくるDomain Specific Architectureの世界
HalideでつくるDomain Specific Architectureの世界Fixstars Corporation
 
Intro to SVE 富岳のA64FXを触ってみた
Intro to SVE 富岳のA64FXを触ってみたIntro to SVE 富岳のA64FXを触ってみた
Intro to SVE 富岳のA64FXを触ってみたMITSUNARI Shigeo
 
AIチップ戦国時代における深層学習モデルの推論の最適化と実用的な運用を可能にするソフトウェア技術について
AIチップ戦国時代における深層学習モデルの推論の最適化と実用的な運用を可能にするソフトウェア技術についてAIチップ戦国時代における深層学習モデルの推論の最適化と実用的な運用を可能にするソフトウェア技術について
AIチップ戦国時代における深層学習モデルの推論の最適化と実用的な運用を可能にするソフトウェア技術についてFixstars Corporation
 

What's hot (20)

ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門
 
Consistent hash
Consistent hashConsistent hash
Consistent hash
 
ソフト高速化の専門家が教える!AI・IoTエッジデバイスの選び方
ソフト高速化の専門家が教える!AI・IoTエッジデバイスの選び方ソフト高速化の専門家が教える!AI・IoTエッジデバイスの選び方
ソフト高速化の専門家が教える!AI・IoTエッジデバイスの選び方
 
DSIRNLP #3 LZ4 の速さの秘密に迫ってみる
DSIRNLP #3 LZ4 の速さの秘密に迫ってみるDSIRNLP #3 LZ4 の速さの秘密に迫ってみる
DSIRNLP #3 LZ4 の速さの秘密に迫ってみる
 
計算機アーキテクチャを考慮した高能率画像処理プログラミング
計算機アーキテクチャを考慮した高能率画像処理プログラミング計算機アーキテクチャを考慮した高能率画像処理プログラミング
計算機アーキテクチャを考慮した高能率画像処理プログラミング
 
高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装
 
並列化による高速化
並列化による高速化 並列化による高速化
並列化による高速化
 
Hopper アーキテクチャで、変わること、変わらないこと
Hopper アーキテクチャで、変わること、変わらないことHopper アーキテクチャで、変わること、変わらないこと
Hopper アーキテクチャで、変わること、変わらないこと
 
レシピの作り方入門
レシピの作り方入門レシピの作り方入門
レシピの作り方入門
 
1076: CUDAデバッグ・プロファイリング入門
1076: CUDAデバッグ・プロファイリング入門1076: CUDAデバッグ・プロファイリング入門
1076: CUDAデバッグ・プロファイリング入門
 
深層学習フレームワークにおけるIntel CPU/富岳向け最適化法
深層学習フレームワークにおけるIntel CPU/富岳向け最適化法深層学習フレームワークにおけるIntel CPU/富岳向け最適化法
深層学習フレームワークにおけるIntel CPU/富岳向け最適化法
 
ゼロから始める深層強化学習(NLP2018講演資料)/ Introduction of Deep Reinforcement Learning
ゼロから始める深層強化学習(NLP2018講演資料)/ Introduction of Deep Reinforcement Learningゼロから始める深層強化学習(NLP2018講演資料)/ Introduction of Deep Reinforcement Learning
ゼロから始める深層強化学習(NLP2018講演資料)/ Introduction of Deep Reinforcement Learning
 
いまさら聞けないarmを使ったNEONの基礎と活用事例
いまさら聞けないarmを使ったNEONの基礎と活用事例いまさら聞けないarmを使ったNEONの基礎と活用事例
いまさら聞けないarmを使ったNEONの基礎と活用事例
 
分散学習のあれこれ~データパラレルからモデルパラレルまで~
分散学習のあれこれ~データパラレルからモデルパラレルまで~分散学習のあれこれ~データパラレルからモデルパラレルまで~
分散学習のあれこれ~データパラレルからモデルパラレルまで~
 
明日使えないすごいビット演算
明日使えないすごいビット演算明日使えないすごいビット演算
明日使えないすごいビット演算
 
LLVM最適化のこつ
LLVM最適化のこつLLVM最適化のこつ
LLVM最適化のこつ
 
Glibc malloc internal
Glibc malloc internalGlibc malloc internal
Glibc malloc internal
 
HalideでつくるDomain Specific Architectureの世界
HalideでつくるDomain Specific Architectureの世界HalideでつくるDomain Specific Architectureの世界
HalideでつくるDomain Specific Architectureの世界
 
Intro to SVE 富岳のA64FXを触ってみた
Intro to SVE 富岳のA64FXを触ってみたIntro to SVE 富岳のA64FXを触ってみた
Intro to SVE 富岳のA64FXを触ってみた
 
AIチップ戦国時代における深層学習モデルの推論の最適化と実用的な運用を可能にするソフトウェア技術について
AIチップ戦国時代における深層学習モデルの推論の最適化と実用的な運用を可能にするソフトウェア技術についてAIチップ戦国時代における深層学習モデルの推論の最適化と実用的な運用を可能にするソフトウェア技術について
AIチップ戦国時代における深層学習モデルの推論の最適化と実用的な運用を可能にするソフトウェア技術について
 

More from Norishige Fukushima

多チャンネルバイラテラルフィルタの高速化
多チャンネルバイラテラルフィルタの高速化多チャンネルバイラテラルフィルタの高速化
多チャンネルバイラテラルフィルタの高速化Norishige Fukushima
 
3次元計測とフィルタリング
3次元計測とフィルタリング3次元計測とフィルタリング
3次元計測とフィルタリングNorishige Fukushima
 
デプスセンサとその応用
デプスセンサとその応用デプスセンサとその応用
デプスセンサとその応用Norishige Fukushima
 
画像処理ライブラリ OpenCV で 出来ること・出来ないこと
画像処理ライブラリ OpenCV で 出来ること・出来ないこと画像処理ライブラリ OpenCV で 出来ること・出来ないこと
画像処理ライブラリ OpenCV で 出来ること・出来ないことNorishige Fukushima
 
複数台のKinectV2の使い方
複数台のKinectV2の使い方複数台のKinectV2の使い方
複数台のKinectV2の使い方Norishige Fukushima
 
Comparison between Blur Transfer and Blur Re-Generation in Depth Image Based ...
Comparison between Blur Transfer and Blur Re-Generation in Depth Image Based ...Comparison between Blur Transfer and Blur Re-Generation in Depth Image Based ...
Comparison between Blur Transfer and Blur Re-Generation in Depth Image Based ...Norishige Fukushima
 
Non-essentiality of Correlation between Image and Depth Map in Free Viewpoin...
Non-essentiality of Correlation between Image and Depth Map in Free Viewpoin...Non-essentiality of Correlation between Image and Depth Map in Free Viewpoin...
Non-essentiality of Correlation between Image and Depth Map in Free Viewpoin...Norishige Fukushima
 
コンピュテーショナルフォトグラフティの基礎
コンピュテーショナルフォトグラフティの基礎コンピュテーショナルフォトグラフティの基礎
コンピュテーショナルフォトグラフティの基礎Norishige Fukushima
 
ガイデットフィルタとその周辺
ガイデットフィルタとその周辺ガイデットフィルタとその周辺
ガイデットフィルタとその周辺Norishige Fukushima
 
Popcntによるハミング距離計算
Popcntによるハミング距離計算Popcntによるハミング距離計算
Popcntによるハミング距離計算Norishige Fukushima
 
コンピューテーショナルフォトグラフィ
コンピューテーショナルフォトグラフィコンピューテーショナルフォトグラフィ
コンピューテーショナルフォトグラフィNorishige Fukushima
 
OpenCVの拡張ユーティリティ関数群
OpenCVの拡張ユーティリティ関数群OpenCVの拡張ユーティリティ関数群
OpenCVの拡張ユーティリティ関数群Norishige Fukushima
 

More from Norishige Fukushima (14)

多チャンネルバイラテラルフィルタの高速化
多チャンネルバイラテラルフィルタの高速化多チャンネルバイラテラルフィルタの高速化
多チャンネルバイラテラルフィルタの高速化
 
3次元計測とフィルタリング
3次元計測とフィルタリング3次元計測とフィルタリング
3次元計測とフィルタリング
 
デプスセンサとその応用
デプスセンサとその応用デプスセンサとその応用
デプスセンサとその応用
 
画像処理ライブラリ OpenCV で 出来ること・出来ないこと
画像処理ライブラリ OpenCV で 出来ること・出来ないこと画像処理ライブラリ OpenCV で 出来ること・出来ないこと
画像処理ライブラリ OpenCV で 出来ること・出来ないこと
 
複数台のKinectV2の使い方
複数台のKinectV2の使い方複数台のKinectV2の使い方
複数台のKinectV2の使い方
 
Libjpeg turboの使い方
Libjpeg turboの使い方Libjpeg turboの使い方
Libjpeg turboの使い方
 
Comparison between Blur Transfer and Blur Re-Generation in Depth Image Based ...
Comparison between Blur Transfer and Blur Re-Generation in Depth Image Based ...Comparison between Blur Transfer and Blur Re-Generation in Depth Image Based ...
Comparison between Blur Transfer and Blur Re-Generation in Depth Image Based ...
 
Non-essentiality of Correlation between Image and Depth Map in Free Viewpoin...
Non-essentiality of Correlation between Image and Depth Map in Free Viewpoin...Non-essentiality of Correlation between Image and Depth Map in Free Viewpoin...
Non-essentiality of Correlation between Image and Depth Map in Free Viewpoin...
 
コンピュテーショナルフォトグラフティの基礎
コンピュテーショナルフォトグラフティの基礎コンピュテーショナルフォトグラフティの基礎
コンピュテーショナルフォトグラフティの基礎
 
ガイデットフィルタとその周辺
ガイデットフィルタとその周辺ガイデットフィルタとその周辺
ガイデットフィルタとその周辺
 
Popcntによるハミング距離計算
Popcntによるハミング距離計算Popcntによるハミング距離計算
Popcntによるハミング距離計算
 
コンピューテーショナルフォトグラフィ
コンピューテーショナルフォトグラフィコンピューテーショナルフォトグラフィ
コンピューテーショナルフォトグラフィ
 
OpenCVの拡張ユーティリティ関数群
OpenCVの拡張ユーティリティ関数群OpenCVの拡張ユーティリティ関数群
OpenCVの拡張ユーティリティ関数群
 
WebP入門
WebP入門WebP入門
WebP入門
 

計算スケジューリングの効果~もし,Halideがなかったら?~