KleidiCV Coverage Report


Directory: ./
File: kleidicv/src/filters/median_blur_sorting_network_3x3.h
Date: 2025-09-25 14:13:34
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 5952 void sorting_network3x3_single_row(KernelWindowFunctor& KernelWindow,
17 T& output_vec,
18 ContextType& context) KLEIDICV_STREAMING {
19 // full sort row
20 5952 Comparator::compare_and_swap(KernelWindow(0, 0), KernelWindow(0, 2), context);
21 5952 Comparator::compare_and_swap(KernelWindow(0, 0), KernelWindow(0, 1), context);
22 5952 Comparator::compare_and_swap(KernelWindow(0, 1), KernelWindow(0, 2), context);
23 5952 Comparator::compare_and_swap(KernelWindow(1, 0), KernelWindow(1, 2), context);
24 5952 Comparator::compare_and_swap(KernelWindow(1, 0), KernelWindow(1, 1), context);
25 5952 Comparator::compare_and_swap(KernelWindow(1, 1), KernelWindow(1, 2), context);
26 5952 Comparator::compare_and_swap(KernelWindow(2, 0), KernelWindow(2, 2), context);
27 5952 Comparator::compare_and_swap(KernelWindow(2, 0), KernelWindow(2, 1), context);
28 5952 Comparator::compare_and_swap(KernelWindow(2, 1), KernelWindow(2, 2), context);
29 // find max in col 0
30 11904 T max_0_1_2 =
31 5952 Comparator::get_max(KernelWindow(0, 0), KernelWindow(1, 0), context);
32 5952 max_0_1_2 = Comparator::get_max(max_0_1_2, KernelWindow(2, 0), context);
33 // find mid in col 1
34 5952 T src_tmp_0 = KernelWindow(0, 1);
35 5952 T mid_0_1_2 = KernelWindow(1, 1);
36 5952 T src_tmp_2 = KernelWindow(2, 1);
37 5952 Comparator::compare_and_swap(src_tmp_0, src_tmp_2, context);
38 5952 Comparator::max(src_tmp_0, mid_0_1_2, context);
39 5952 Comparator::min(mid_0_1_2, src_tmp_2, context);
40 // find min in col 2
41 11904 T min_0_1_2 =
42 5952 Comparator::get_min(KernelWindow(0, 2), KernelWindow(1, 2), context);
43 5952 min_0_1_2 = Comparator::get_min(min_0_1_2, KernelWindow(2, 2), context);
44 // find median
45 5952 Comparator::compare_and_swap(min_0_1_2, max_0_1_2, context);
46 5952 Comparator::max(min_0_1_2, mid_0_1_2, context);
47 5952 Comparator::min(mid_0_1_2, max_0_1_2, context);
48 5952 output_vec = mid_0_1_2;
49 5952 }
50
51 template <class Comparator, typename KernelWindowFunctor, typename T,
52 typename ContextType>
53 29172 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 29172 Comparator::compare_and_swap(KernelWindow(0, 0), KernelWindow(0, 2), context);
58 29172 Comparator::compare_and_swap(KernelWindow(0, 0), KernelWindow(0, 1), context);
59 29172 Comparator::compare_and_swap(KernelWindow(0, 1), KernelWindow(0, 2), context);
60 29172 Comparator::compare_and_swap(KernelWindow(1, 0), KernelWindow(1, 2), context);
61 29172 Comparator::compare_and_swap(KernelWindow(1, 0), KernelWindow(1, 1), context);
62 29172 Comparator::compare_and_swap(KernelWindow(1, 1), KernelWindow(1, 2), context);
63 29172 Comparator::compare_and_swap(KernelWindow(2, 0), KernelWindow(2, 2), context);
64 29172 Comparator::compare_and_swap(KernelWindow(2, 0), KernelWindow(2, 1), context);
65 29172 Comparator::compare_and_swap(KernelWindow(2, 1), KernelWindow(2, 2), context);
66 29172 Comparator::compare_and_swap(KernelWindow(3, 0), KernelWindow(3, 2), context);
67 29172 Comparator::compare_and_swap(KernelWindow(3, 0), KernelWindow(3, 1), context);
68 29172 Comparator::compare_and_swap(KernelWindow(3, 1), KernelWindow(3, 2), context);
69 // sort common element
70 29172 Comparator::compare_and_swap(KernelWindow(1, 0), KernelWindow(2, 0), context);
71 29172 Comparator::compare_and_swap(KernelWindow(1, 2), KernelWindow(2, 2), context);
72 29172 Comparator::compare_and_swap(KernelWindow(1, 1), KernelWindow(2, 1), context);
73 // find first median
74 // find max in col 0
75 58344 T max_0_1_2 =
76 29172 Comparator::get_max(KernelWindow(0, 0), KernelWindow(2, 0), context);
77 // find mid in col 1
78 58344 T src_tmp_0 =
79 29172 Comparator::get_min(KernelWindow(0, 1), KernelWindow(2, 1), context);
80 29172 T mid_0_1_2 = Comparator::get_max(KernelWindow(1, 1), src_tmp_0, context);
81 // find min in col 2
82 58344 T min_0_1_2 =
83 29172 Comparator::get_min(KernelWindow(0, 2), KernelWindow(1, 2), context);
84 // find median
85 29172 Comparator::compare_and_swap(min_0_1_2, max_0_1_2, context);
86 29172 Comparator::max(min_0_1_2, mid_0_1_2, context);
87 29172 Comparator::min(mid_0_1_2, max_0_1_2, context);
88 29172 output_vec_0 = mid_0_1_2;
89 // find second median
90 // find max in col 0
91 29172 max_0_1_2 =
92 29172 Comparator::get_max(KernelWindow(2, 0), KernelWindow(3, 0), context);
93 // find mid in col 1
94 29172 src_tmp_0 =
95 29172 Comparator::get_max(KernelWindow(1, 1), KernelWindow(3, 1), context);
96 29172 mid_0_1_2 = Comparator::get_min(KernelWindow(2, 1), src_tmp_0, context);
97 // find min in col 2
98 29172 min_0_1_2 =
99 29172 Comparator::get_min(KernelWindow(1, 2), KernelWindow(3, 2), context);
100 // find median
101 29172 Comparator::compare_and_swap(min_0_1_2, max_0_1_2, context);
102 29172 Comparator::max(min_0_1_2, mid_0_1_2, context);
103 29172 Comparator::min(mid_0_1_2, max_0_1_2, context);
104 29172 output_vec_1 = mid_0_1_2;
105 29172 }
106
107 } // namespace KLEIDICV_TARGET_NAMESPACE
108
109 #endif // KLEIDICV_MEDIAN_BLUR_SORTING_NETWORK_3X3_H
110