KleidiCV Coverage Report


Directory: ./
File: kleidicv/src/filters/median_blur_sorting_network_3x3.h
Date: 2026-01-20 20:58:59
Exec Total Coverage
Lines: 66 66 100.0%
Functions: 56 56 100.0%
Branches: 0 0 -%

Line Branch Exec Source
1 // SPDX-FileCopyrightText: 2025 Arm Limited and/or its affiliates <open-source-office@arm.com>
2 //
3 // SPDX-License-Identifier: Apache-2.0
4
5 #ifndef KLEIDICV_MEDIAN_BLUR_SORTING_NETWORK_3X3_H
6 #define KLEIDICV_MEDIAN_BLUR_SORTING_NETWORK_3X3_H
7
8 #include <algorithm>
9
10 #include "kleidicv/kleidicv.h"
11 #include "kleidicv/traits.h"
12
13 namespace KLEIDICV_TARGET_NAMESPACE {
14 template <class Comparator, typename KernelWindowFunctor, typename T,
15 typename ContextType>
16 8320 void sorting_network3x3_single_row(KernelWindowFunctor& KernelWindow,
17 T& output_vec,
18 ContextType& context) KLEIDICV_STREAMING {
19 // full sort row
20 8320 Comparator::compare_and_swap(KernelWindow(0, 0), KernelWindow(0, 2), context);
21 8320 Comparator::compare_and_swap(KernelWindow(0, 0), KernelWindow(0, 1), context);
22 8320 Comparator::compare_and_swap(KernelWindow(0, 1), KernelWindow(0, 2), context);
23 8320 Comparator::compare_and_swap(KernelWindow(1, 0), KernelWindow(1, 2), context);
24 8320 Comparator::compare_and_swap(KernelWindow(1, 0), KernelWindow(1, 1), context);
25 8320 Comparator::compare_and_swap(KernelWindow(1, 1), KernelWindow(1, 2), context);
26 8320 Comparator::compare_and_swap(KernelWindow(2, 0), KernelWindow(2, 2), context);
27 8320 Comparator::compare_and_swap(KernelWindow(2, 0), KernelWindow(2, 1), context);
28 8320 Comparator::compare_and_swap(KernelWindow(2, 1), KernelWindow(2, 2), context);
29 // find max in col 0
30 16640 T max_0_1_2 =
31 8320 Comparator::get_max(KernelWindow(0, 0), KernelWindow(1, 0), context);
32 8320 max_0_1_2 = Comparator::get_max(max_0_1_2, KernelWindow(2, 0), context);
33 // find mid in col 1
34 8320 T src_tmp_0 = KernelWindow(0, 1);
35 8320 T mid_0_1_2 = KernelWindow(1, 1);
36 8320 T src_tmp_2 = KernelWindow(2, 1);
37 8320 Comparator::compare_and_swap(src_tmp_0, src_tmp_2, context);
38 8320 Comparator::max(src_tmp_0, mid_0_1_2, context);
39 8320 Comparator::min(mid_0_1_2, src_tmp_2, context);
40 // find min in col 2
41 16640 T min_0_1_2 =
42 8320 Comparator::get_min(KernelWindow(0, 2), KernelWindow(1, 2), context);
43 8320 min_0_1_2 = Comparator::get_min(min_0_1_2, KernelWindow(2, 2), context);
44 // find median
45 8320 Comparator::compare_and_swap(min_0_1_2, max_0_1_2, context);
46 8320 Comparator::max(min_0_1_2, mid_0_1_2, context);
47 8320 Comparator::min(mid_0_1_2, max_0_1_2, context);
48 8320 output_vec = mid_0_1_2;
49 8320 }
50
51 template <class Comparator, typename KernelWindowFunctor, typename T,
52 typename ContextType>
53 36388 void sorting_network3x3_dual_rows(KernelWindowFunctor& KernelWindow,
54 T& output_vec_0, T& output_vec_1,
55 ContextType& context) KLEIDICV_STREAMING {
56 // full sort row
57 36388 Comparator::compare_and_swap(KernelWindow(0, 0), KernelWindow(0, 2), context);
58 36388 Comparator::compare_and_swap(KernelWindow(0, 0), KernelWindow(0, 1), context);
59 36388 Comparator::compare_and_swap(KernelWindow(0, 1), KernelWindow(0, 2), context);
60 36388 Comparator::compare_and_swap(KernelWindow(1, 0), KernelWindow(1, 2), context);
61 36388 Comparator::compare_and_swap(KernelWindow(1, 0), KernelWindow(1, 1), context);
62 36388 Comparator::compare_and_swap(KernelWindow(1, 1), KernelWindow(1, 2), context);
63 36388 Comparator::compare_and_swap(KernelWindow(2, 0), KernelWindow(2, 2), context);
64 36388 Comparator::compare_and_swap(KernelWindow(2, 0), KernelWindow(2, 1), context);
65 36388 Comparator::compare_and_swap(KernelWindow(2, 1), KernelWindow(2, 2), context);
66 36388 Comparator::compare_and_swap(KernelWindow(3, 0), KernelWindow(3, 2), context);
67 36388 Comparator::compare_and_swap(KernelWindow(3, 0), KernelWindow(3, 1), context);
68 36388 Comparator::compare_and_swap(KernelWindow(3, 1), KernelWindow(3, 2), context);
69 // sort common element
70 36388 Comparator::compare_and_swap(KernelWindow(1, 0), KernelWindow(2, 0), context);
71 36388 Comparator::compare_and_swap(KernelWindow(1, 2), KernelWindow(2, 2), context);
72 36388 Comparator::compare_and_swap(KernelWindow(1, 1), KernelWindow(2, 1), context);
73 // find first median
74 // find max in col 0
75 72776 T max_0_1_2 =
76 36388 Comparator::get_max(KernelWindow(0, 0), KernelWindow(2, 0), context);
77 // find mid in col 1
78 72776 T src_tmp_0 =
79 36388 Comparator::get_min(KernelWindow(0, 1), KernelWindow(2, 1), context);
80 36388 T mid_0_1_2 = Comparator::get_max(KernelWindow(1, 1), src_tmp_0, context);
81 // find min in col 2
82 72776 T min_0_1_2 =
83 36388 Comparator::get_min(KernelWindow(0, 2), KernelWindow(1, 2), context);
84 // find median
85 36388 Comparator::compare_and_swap(min_0_1_2, max_0_1_2, context);
86 36388 Comparator::max(min_0_1_2, mid_0_1_2, context);
87 36388 Comparator::min(mid_0_1_2, max_0_1_2, context);
88 36388 output_vec_0 = mid_0_1_2;
89 // find second median
90 // find max in col 0
91 36388 max_0_1_2 =
92 36388 Comparator::get_max(KernelWindow(2, 0), KernelWindow(3, 0), context);
93 // find mid in col 1
94 36388 src_tmp_0 =
95 36388 Comparator::get_max(KernelWindow(1, 1), KernelWindow(3, 1), context);
96 36388 mid_0_1_2 = Comparator::get_min(KernelWindow(2, 1), src_tmp_0, context);
97 // find min in col 2
98 36388 min_0_1_2 =
99 36388 Comparator::get_min(KernelWindow(1, 2), KernelWindow(3, 2), context);
100 // find median
101 36388 Comparator::compare_and_swap(min_0_1_2, max_0_1_2, context);
102 36388 Comparator::max(min_0_1_2, mid_0_1_2, context);
103 36388 Comparator::min(mid_0_1_2, max_0_1_2, context);
104 36388 output_vec_1 = mid_0_1_2;
105 36388 }
106
107 } // namespace KLEIDICV_TARGET_NAMESPACE
108
109 #endif // KLEIDICV_MEDIAN_BLUR_SORTING_NETWORK_3X3_H
110