More Related Content More from Norishige Fukushima (15) 計算スケジューリングの効果~もし,Halideがなかったら?~12. 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); }
計算する場合
15. 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. 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)
{...
22. 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
29. 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);
35. 35境界領域計算のまとめ
(a) 縦横分岐有り
(b) 縦か横に分岐有り
(c) 分岐無し
(a) (a)
(a)(a)
(b)
(b)
(b) (b)(c)
Halideの実装(多分.要検証)
• a,b,cでループを分割
• a,bの領域はすべては折り返し用のアドレス演算を計算
• cはそもまま
今回の実装
• a,b,cでループを分割
• アドレス計算演算する領域を最小化
• (計算方法自体は,一応もう少し高速化できるがつらい...)
67. 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)
結果
72. 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
宣伝