1 // Copyright 2019 Google LLC 2 // 3 // This source code is licensed under the BSD-style license found in the 4 // LICENSE file in the root directory of this source tree. 5 6 #include <gtest/gtest.h> 7 8 #include <xnnpack/common.h> 9 #include <xnnpack/isa-checks.h> 10 11 #include <xnnpack/gavgpool.h> 12 #include "gavgpool-cw-microkernel-tester.h" 13 14 15 #if XNN_ENABLE_ARM_FP16 && (XNN_ARCH_ARM || XNN_ARCH_ARM64) TEST(F16_GAVGPOOL_CW__NEONFP16ARITH_X8,elements_eq_8)16 TEST(F16_GAVGPOOL_CW__NEONFP16ARITH_X8, elements_eq_8) { 17 TEST_REQUIRES_ARM_NEON_FP16_ARITH; 18 GAvgPoolCWMicrokernelTester() 19 .elements(8) 20 .channels(4) 21 .Test(xnn_f16_gavgpool_cw_ukernel__neonfp16arith_x8, xnn_init_f16_gavgpool_neonfp16arith_x8_params); 22 } 23 TEST(F16_GAVGPOOL_CW__NEONFP16ARITH_X8,channels_eq_8)24 TEST(F16_GAVGPOOL_CW__NEONFP16ARITH_X8, channels_eq_8) { 25 TEST_REQUIRES_ARM_NEON_FP16_ARITH; 26 GAvgPoolCWMicrokernelTester() 27 .elements(8) 28 .channels(8) 29 .Test(xnn_f16_gavgpool_cw_ukernel__neonfp16arith_x8, xnn_init_f16_gavgpool_neonfp16arith_x8_params); 30 } 31 TEST(F16_GAVGPOOL_CW__NEONFP16ARITH_X8,elements_div_8)32 TEST(F16_GAVGPOOL_CW__NEONFP16ARITH_X8, elements_div_8) { 33 TEST_REQUIRES_ARM_NEON_FP16_ARITH; 34 for (size_t elements = 8; elements < 32; elements += 8) { 35 GAvgPoolCWMicrokernelTester() 36 .elements(elements) 37 .channels(4) 38 .Test(xnn_f16_gavgpool_cw_ukernel__neonfp16arith_x8, xnn_init_f16_gavgpool_neonfp16arith_x8_params); 39 } 40 } 41 TEST(F16_GAVGPOOL_CW__NEONFP16ARITH_X8,elements_lt_8)42 TEST(F16_GAVGPOOL_CW__NEONFP16ARITH_X8, elements_lt_8) { 43 TEST_REQUIRES_ARM_NEON_FP16_ARITH; 44 for (size_t elements = 1; elements < 8; elements++) { 45 GAvgPoolCWMicrokernelTester() 46 .elements(elements) 47 .channels(4) 48 .Test(xnn_f16_gavgpool_cw_ukernel__neonfp16arith_x8, xnn_init_f16_gavgpool_neonfp16arith_x8_params); 49 } 50 } 51 TEST(F16_GAVGPOOL_CW__NEONFP16ARITH_X8,elements_gt_8)52 TEST(F16_GAVGPOOL_CW__NEONFP16ARITH_X8, elements_gt_8) { 53 TEST_REQUIRES_ARM_NEON_FP16_ARITH; 54 for (size_t elements = 9; elements < 16; elements++) { 55 GAvgPoolCWMicrokernelTester() 56 .elements(elements) 57 .channels(4) 58 .Test(xnn_f16_gavgpool_cw_ukernel__neonfp16arith_x8, xnn_init_f16_gavgpool_neonfp16arith_x8_params); 59 } 60 } 61 TEST(F16_GAVGPOOL_CW__NEONFP16ARITH_X8,channels_lt_4)62 TEST(F16_GAVGPOOL_CW__NEONFP16ARITH_X8, channels_lt_4) { 63 TEST_REQUIRES_ARM_NEON_FP16_ARITH; 64 for (size_t channels = 1; channels < 4; channels++) { 65 for (size_t elements = 1; elements < 16; elements += 3) { 66 GAvgPoolCWMicrokernelTester() 67 .elements(elements) 68 .channels(channels) 69 .Test(xnn_f16_gavgpool_cw_ukernel__neonfp16arith_x8, xnn_init_f16_gavgpool_neonfp16arith_x8_params); 70 } 71 } 72 } 73 TEST(F16_GAVGPOOL_CW__NEONFP16ARITH_X8,channels_gt_4)74 TEST(F16_GAVGPOOL_CW__NEONFP16ARITH_X8, channels_gt_4) { 75 TEST_REQUIRES_ARM_NEON_FP16_ARITH; 76 for (size_t channels = 5; channels < 8; channels++) { 77 for (size_t elements = 1; elements < 16; elements += 3) { 78 GAvgPoolCWMicrokernelTester() 79 .elements(elements) 80 .channels(channels) 81 .Test(xnn_f16_gavgpool_cw_ukernel__neonfp16arith_x8, xnn_init_f16_gavgpool_neonfp16arith_x8_params); 82 } 83 } 84 } 85 TEST(F16_GAVGPOOL_CW__NEONFP16ARITH_X8,channels_div_4)86 TEST(F16_GAVGPOOL_CW__NEONFP16ARITH_X8, channels_div_4) { 87 TEST_REQUIRES_ARM_NEON_FP16_ARITH; 88 for (size_t channels = 8; channels <= 16; channels += 4) { 89 for (size_t elements = 1; elements < 16; elements += 3) { 90 GAvgPoolCWMicrokernelTester() 91 .elements(elements) 92 .channels(channels) 93 .Test(xnn_f16_gavgpool_cw_ukernel__neonfp16arith_x8, xnn_init_f16_gavgpool_neonfp16arith_x8_params); 94 } 95 } 96 } 97 TEST(F16_GAVGPOOL_CW__NEONFP16ARITH_X8,qmin)98 TEST(F16_GAVGPOOL_CW__NEONFP16ARITH_X8, qmin) { 99 TEST_REQUIRES_ARM_NEON_FP16_ARITH; 100 for (size_t elements = 1; elements < 16; elements += 3) { 101 GAvgPoolCWMicrokernelTester() 102 .elements(elements) 103 .channels(4) 104 .qmin(128) 105 .Test(xnn_f16_gavgpool_cw_ukernel__neonfp16arith_x8, xnn_init_f16_gavgpool_neonfp16arith_x8_params); 106 } 107 } 108 TEST(F16_GAVGPOOL_CW__NEONFP16ARITH_X8,qmax)109 TEST(F16_GAVGPOOL_CW__NEONFP16ARITH_X8, qmax) { 110 TEST_REQUIRES_ARM_NEON_FP16_ARITH; 111 for (size_t elements = 1; elements < 16; elements += 3) { 112 GAvgPoolCWMicrokernelTester() 113 .elements(elements) 114 .channels(4) 115 .qmax(128) 116 .Test(xnn_f16_gavgpool_cw_ukernel__neonfp16arith_x8, xnn_init_f16_gavgpool_neonfp16arith_x8_params); 117 } 118 } 119 TEST(F16_GAVGPOOL_CW__NEONFP16ARITH_X4,elements_eq_4)120 TEST(F16_GAVGPOOL_CW__NEONFP16ARITH_X4, elements_eq_4) { 121 TEST_REQUIRES_ARM_NEON_FP16_ARITH; 122 GAvgPoolCWMicrokernelTester() 123 .elements(4) 124 .channels(4) 125 .Test(xnn_f16_gavgpool_cw_ukernel__neonfp16arith_x4, xnn_init_f16_gavgpool_neonfp16arith_x4_params); 126 } 127 TEST(F16_GAVGPOOL_CW__NEONFP16ARITH_X4,channels_eq_5)128 TEST(F16_GAVGPOOL_CW__NEONFP16ARITH_X4, channels_eq_5) { 129 TEST_REQUIRES_ARM_NEON_FP16_ARITH; 130 GAvgPoolCWMicrokernelTester() 131 .elements(4) 132 .channels(5) 133 .Test(xnn_f16_gavgpool_cw_ukernel__neonfp16arith_x4, xnn_init_f16_gavgpool_neonfp16arith_x4_params); 134 } 135 TEST(F16_GAVGPOOL_CW__NEONFP16ARITH_X4,channels_eq_8)136 TEST(F16_GAVGPOOL_CW__NEONFP16ARITH_X4, channels_eq_8) { 137 TEST_REQUIRES_ARM_NEON_FP16_ARITH; 138 GAvgPoolCWMicrokernelTester() 139 .elements(4) 140 .channels(8) 141 .Test(xnn_f16_gavgpool_cw_ukernel__neonfp16arith_x4, xnn_init_f16_gavgpool_neonfp16arith_x4_params); 142 } 143 TEST(F16_GAVGPOOL_CW__NEONFP16ARITH_X4,elements_div_4)144 TEST(F16_GAVGPOOL_CW__NEONFP16ARITH_X4, elements_div_4) { 145 TEST_REQUIRES_ARM_NEON_FP16_ARITH; 146 for (size_t elements = 8; elements < 32; elements += 4) { 147 GAvgPoolCWMicrokernelTester() 148 .elements(elements) 149 .channels(4) 150 .Test(xnn_f16_gavgpool_cw_ukernel__neonfp16arith_x4, xnn_init_f16_gavgpool_neonfp16arith_x4_params); 151 } 152 } 153 TEST(F16_GAVGPOOL_CW__NEONFP16ARITH_X4,elements_lt_4)154 TEST(F16_GAVGPOOL_CW__NEONFP16ARITH_X4, elements_lt_4) { 155 TEST_REQUIRES_ARM_NEON_FP16_ARITH; 156 for (size_t elements = 1; elements < 4; elements++) { 157 GAvgPoolCWMicrokernelTester() 158 .elements(elements) 159 .channels(4) 160 .Test(xnn_f16_gavgpool_cw_ukernel__neonfp16arith_x4, xnn_init_f16_gavgpool_neonfp16arith_x4_params); 161 } 162 } 163 TEST(F16_GAVGPOOL_CW__NEONFP16ARITH_X4,elements_gt_4)164 TEST(F16_GAVGPOOL_CW__NEONFP16ARITH_X4, elements_gt_4) { 165 TEST_REQUIRES_ARM_NEON_FP16_ARITH; 166 for (size_t elements = 5; elements < 8; elements++) { 167 GAvgPoolCWMicrokernelTester() 168 .elements(elements) 169 .channels(4) 170 .Test(xnn_f16_gavgpool_cw_ukernel__neonfp16arith_x4, xnn_init_f16_gavgpool_neonfp16arith_x4_params); 171 } 172 } 173 TEST(F16_GAVGPOOL_CW__NEONFP16ARITH_X4,channels_lt_4)174 TEST(F16_GAVGPOOL_CW__NEONFP16ARITH_X4, channels_lt_4) { 175 TEST_REQUIRES_ARM_NEON_FP16_ARITH; 176 for (size_t channels = 1; channels < 4; channels++) { 177 for (size_t elements = 1; elements < 16; elements += 3) { 178 GAvgPoolCWMicrokernelTester() 179 .elements(elements) 180 .channels(channels) 181 .Test(xnn_f16_gavgpool_cw_ukernel__neonfp16arith_x4, xnn_init_f16_gavgpool_neonfp16arith_x4_params); 182 } 183 } 184 } 185 TEST(F16_GAVGPOOL_CW__NEONFP16ARITH_X4,channels_gt_4)186 TEST(F16_GAVGPOOL_CW__NEONFP16ARITH_X4, channels_gt_4) { 187 TEST_REQUIRES_ARM_NEON_FP16_ARITH; 188 for (size_t channels = 5; channels < 8; channels++) { 189 for (size_t elements = 1; elements < 16; elements += 3) { 190 GAvgPoolCWMicrokernelTester() 191 .elements(elements) 192 .channels(channels) 193 .Test(xnn_f16_gavgpool_cw_ukernel__neonfp16arith_x4, xnn_init_f16_gavgpool_neonfp16arith_x4_params); 194 } 195 } 196 } 197 TEST(F16_GAVGPOOL_CW__NEONFP16ARITH_X4,channels_div_4)198 TEST(F16_GAVGPOOL_CW__NEONFP16ARITH_X4, channels_div_4) { 199 TEST_REQUIRES_ARM_NEON_FP16_ARITH; 200 for (size_t channels = 8; channels <= 16; channels += 4) { 201 for (size_t elements = 1; elements < 16; elements += 3) { 202 GAvgPoolCWMicrokernelTester() 203 .elements(elements) 204 .channels(channels) 205 .Test(xnn_f16_gavgpool_cw_ukernel__neonfp16arith_x4, xnn_init_f16_gavgpool_neonfp16arith_x4_params); 206 } 207 } 208 } 209 TEST(F16_GAVGPOOL_CW__NEONFP16ARITH_X4,qmin)210 TEST(F16_GAVGPOOL_CW__NEONFP16ARITH_X4, qmin) { 211 TEST_REQUIRES_ARM_NEON_FP16_ARITH; 212 for (size_t elements = 1; elements < 16; elements += 3) { 213 GAvgPoolCWMicrokernelTester() 214 .elements(elements) 215 .channels(4) 216 .qmin(128) 217 .Test(xnn_f16_gavgpool_cw_ukernel__neonfp16arith_x4, xnn_init_f16_gavgpool_neonfp16arith_x4_params); 218 } 219 } 220 TEST(F16_GAVGPOOL_CW__NEONFP16ARITH_X4,qmax)221 TEST(F16_GAVGPOOL_CW__NEONFP16ARITH_X4, qmax) { 222 TEST_REQUIRES_ARM_NEON_FP16_ARITH; 223 for (size_t elements = 1; elements < 16; elements += 3) { 224 GAvgPoolCWMicrokernelTester() 225 .elements(elements) 226 .channels(4) 227 .qmax(128) 228 .Test(xnn_f16_gavgpool_cw_ukernel__neonfp16arith_x4, xnn_init_f16_gavgpool_neonfp16arith_x4_params); 229 } 230 } 231 #endif // XNN_ENABLE_ARM_FP16 && (XNN_ARCH_ARM || XNN_ARCH_ARM64) 232