Skip to content

Commit 38b1543

Browse files
qukhanxnnpack-bot
authored andcommitted
Add the configuration identifier to the weight cache look up key for deconvolution-nhwc.
PiperOrigin-RevId: 807200228
1 parent 55167ae commit 38b1543

17 files changed

+411
-21
lines changed

include/experimental.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,23 @@ enum xnn_status xnn_update_runtime_with_threadpool(
9696
xnn_runtime_t runtime,
9797
xnn_threadpool_t threadpool);
9898

99+
100+
typedef struct xnn_config_identifier {
101+
uint64_t identifier;
102+
} xnn_config_identifier;
103+
104+
/// Check whether the given configuration matches one that is currently in use.
105+
///
106+
/// @returns True if the configuration matches.
107+
bool xnn_check_config_version(const struct xnn_config_identifier* identifier);
108+
109+
/// Returns a valid microkernel configuration.
110+
///
111+
/// This is useful for consumers of this API that want to test their checks
112+
/// against kernel configurations.
113+
const struct xnn_config_identifier* xnn_get_test_config();
114+
115+
99116
#ifdef __cplusplus
100117
} // extern "C"
101118
#endif

include/xnnpack.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2294,6 +2294,11 @@ struct xnn_weights_cache_look_up_key {
22942294
const void* kernel;
22952295
/// Pointer to the original bias, could be NULL.
22962296
const void* bias;
2297+
/// Pointer to the operation configuration, can be NULL.
2298+
///
2299+
/// If this is set, then the cache is allowed to compare the configuration to
2300+
/// previous runs and maybe reuse those run results.
2301+
const struct xnn_config_identifier* config;
22972302
};
22982303

22992304
/// A group of function pointers to manage weights cache. All functions may be

src/configs/BUILD

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ xnnpack_cc_library(
6969
"avgpool-config.c",
7070
"binary-elementwise-config.c",
7171
"cmul-config.c",
72+
"config-identifier.c",
7273
"conv-hwc2chw-config.c",
7374
"dwconv-config.c",
7475
"dwconv2d-chw-config.c",

src/configs/config-identifier.c

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
// Copyright 2025 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 <limits.h>
7+
#include <stdbool.h>
8+
#include <stdint.h>
9+
#include <stdio.h>
10+
11+
#include "include/experimental.h"
12+
#include "src/xnnpack/config-types.h"
13+
#include "src/xnnpack/config.h"
14+
15+
xnn_config_identifier xnn_create_config_identifier(xnn_config_name name,
16+
uint32_t version) {
17+
struct xnn_config_identifier id = {((uint64_t)name) << 32 | version};
18+
return id;
19+
}
20+
21+
xnn_config_name xnn_get_config_name(const xnn_config_identifier* identifier) {
22+
return identifier->identifier >> 32;
23+
}
24+
25+
xnn_config_name xnn_get_config_version(
26+
const xnn_config_identifier* identifier) {
27+
return identifier->identifier & 0xffffffff;
28+
}
29+
30+
const xnn_config_identifier* xnn_get_test_config() {
31+
const struct xnn_gemm_config* f32_config =
32+
xnn_init_f32_gemm_config(/*flags=*/0);
33+
return &(f32_config->identifier);
34+
}
35+
36+
#define XNNPACK_CHECK_CONFIG(CONFIG_NAME, ...) \
37+
if (config_name == xnn_config_name_##CONFIG_NAME) { \
38+
const struct xnn_gemm_config* kernel_config = \
39+
xnn_init_##CONFIG_NAME##_config(__VA_ARGS__); \
40+
return kernel_config && \
41+
identifier->identifier == kernel_config->identifier.identifier; \
42+
}
43+
44+
bool xnn_check_config_version(const xnn_config_identifier* identifier) {
45+
if (identifier == NULL) {
46+
return false;
47+
}
48+
const xnn_config_name config_name = xnn_get_config_name(identifier);
49+
XNNPACK_CHECK_CONFIG(bf16_f32_gemm);
50+
XNNPACK_CHECK_CONFIG(f16_gemm);
51+
XNNPACK_CHECK_CONFIG(f32_gemm, /*flags=*/0);
52+
XNNPACK_CHECK_CONFIG(f32_gemm_nr2, /*flags=*/0);
53+
XNNPACK_CHECK_CONFIG(f32_igemm);
54+
XNNPACK_CHECK_CONFIG(f32_qc8w_gemm);
55+
XNNPACK_CHECK_CONFIG(f32_qc4w_gemm);
56+
XNNPACK_CHECK_CONFIG(pf16_gemm);
57+
XNNPACK_CHECK_CONFIG(pf32_gemm);
58+
XNNPACK_CHECK_CONFIG(pqs8_qc8w_gemm);
59+
XNNPACK_CHECK_CONFIG(qd8_f16_qb4w_gemm);
60+
XNNPACK_CHECK_CONFIG(qd8_f16_qc4w_gemm);
61+
XNNPACK_CHECK_CONFIG(qd8_f16_qc8w_gemm);
62+
XNNPACK_CHECK_CONFIG(qd8_f16_qc8w_igemm);
63+
XNNPACK_CHECK_CONFIG(qd8_f32_qb4w_gemm);
64+
XNNPACK_CHECK_CONFIG(qd8_f32_qc4w_gemm);
65+
XNNPACK_CHECK_CONFIG(qd8_f32_qc8w_gemm);
66+
XNNPACK_CHECK_CONFIG(qp8_f32_qc4w_gemm);
67+
XNNPACK_CHECK_CONFIG(qp8_f32_qc8w_gemm);
68+
XNNPACK_CHECK_CONFIG(qp8_f32_qb4w_gemm);
69+
XNNPACK_CHECK_CONFIG(qdu8_f32_qc4w_gemm);
70+
XNNPACK_CHECK_CONFIG(qdu8_f16_qc8w_gemm);
71+
XNNPACK_CHECK_CONFIG(qdu8_f32_qc8w_gemm);
72+
XNNPACK_CHECK_CONFIG(qdu8_f32_qb4w_gemm);
73+
XNNPACK_CHECK_CONFIG(qdu8_f16_qc4w_gemm);
74+
XNNPACK_CHECK_CONFIG(qdu8_f32_qc8w_igemm);
75+
XNNPACK_CHECK_CONFIG(qs8_qc4w_gemm);
76+
XNNPACK_CHECK_CONFIG(qs8_qc8w_gemm);
77+
XNNPACK_CHECK_CONFIG(qu8_gemm);
78+
return false;
79+
}

src/configs/dwconv-config.c

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,10 @@ XNN_INIT_ONCE_GUARD(qu8_dwconv);
3434
xnn_log_info("Using dwconv microkernel '%s'.", #ukernel);
3535

3636
static void init_f16_dwconv_config(void) {
37+
// LINT.IfChange(f16_dwconv_identifier)
38+
f16_dwconv_config.identifier = xnn_create_config_identifier(xnn_config_name_f16_dwconv, /*version=*/0);
39+
// LINT.ThenChange(:f16_dwconv_config)
40+
// LINT.IfChange(f16_dwconv_config)
3741
#if XNN_ARCH_ARM && XNN_ENABLE_ARM_FP16_VECTOR && XNN_ENABLE_ARM_FP16_SCALAR
3842
const struct xnn_hardware_config* hardware_config = xnn_init_hardware_config();
3943
assert(hardware_config != NULL);
@@ -107,9 +111,14 @@ static void init_f16_dwconv_config(void) {
107111
f16_dwconv_config[3].primary_tile = 25;
108112
}
109113
#endif
114+
// LINT.ThenChange(:f16_dwconv_identifier)
110115
}
111116

112117
static void init_f32_dwconv_config(void) {
118+
// LINT.IfChange(f32_dwconv_identifier)
119+
f32_dwconv_config.identifier = xnn_create_config_identifier(xnn_config_name_f32_dwconv, /*version=*/0);
120+
// LINT.ThenChange(:f32_dwconv_config)
121+
// LINT.IfChange(f32_dwconv_config)
113122
#if XNN_ARCH_ARM
114123
const struct xnn_hardware_config* hardware_config = xnn_init_hardware_config();
115124
assert(hardware_config != NULL);
@@ -441,9 +450,14 @@ static void init_f32_dwconv_config(void) {
441450
f32_dwconv_config[3].channel_tile = 1;
442451
f32_dwconv_config[3].primary_tile = 25;
443452
#endif
453+
// LINT.ThenChange(:f32_dwconv_identifier)
444454
}
445455

446456
static void init_qs8_qc8w_dwconv_config(void) {
457+
// LINT.IfChange(qs8_qc8w_dwconv_identifier)
458+
qs8_qc8w_dwconv_config.identifier = xnn_create_config_identifier(xnn_config_name_qs8_qc8w_dwconv, /*version=*/0);
459+
// LINT.ThenChange(:qs8_qc8w_dwconv_config)
460+
// LINT.IfChange(qs8_qc8w_dwconv_config)
447461
#if XNN_ARCH_ARM
448462
const struct xnn_hardware_config* hardware_config = xnn_init_hardware_config();
449463
assert(hardware_config != NULL);
@@ -603,9 +617,14 @@ static void init_qs8_qc8w_dwconv_config(void) {
603617
qs8_qc8w_dwconv_config[2].channel_tile = 2;
604618
qs8_qc8w_dwconv_config[2].primary_tile = 25;
605619
#endif
620+
// LINT.ThenChange(:qs8_qc8w_dwconv_identifier)
606621
}
607622

608623
static void init_qs8_dwconv_config(void) {
624+
// LINT.IfChange(qs8_dwconv_identifier)
625+
qs8_dwconv_config.identifier = xnn_create_config_identifier(xnn_config_name_qs8_dwconv, /*version=*/0);
626+
// LINT.ThenChange(:qs8_dwconv_config)
627+
// LINT.IfChange(qs8_dwconv_config)
609628
#if XNN_ARCH_ARM
610629
const struct xnn_hardware_config* hardware_config = xnn_init_hardware_config();
611630
assert(hardware_config != NULL);
@@ -710,9 +729,14 @@ static void init_qs8_dwconv_config(void) {
710729
qs8_dwconv_config[1].channel_tile = 2;
711730
qs8_dwconv_config[1].primary_tile = 25;
712731
#endif
732+
// LINT.ThenChange(:qs8_dwconv_identifier)
713733
}
714734

715735
static void init_qu8_dwconv_config(void) {
736+
// LINT.IfChange(qu8_dwconv_identifier)
737+
qu8_dwconv_config.identifier = xnn_create_config_identifier(xnn_config_name_qu8_dwconv, /*version=*/0);
738+
// LINT.ThenChange(:qu8_dwconv_config)
739+
// LINT.IfChange(qu8_dwconv_config)
716740
#if XNN_ARCH_ARM
717741
const struct xnn_hardware_config* hardware_config = xnn_init_hardware_config();
718742
assert(hardware_config != NULL);
@@ -817,6 +841,7 @@ static void init_qu8_dwconv_config(void) {
817841
qu8_dwconv_config[1].channel_tile = 2;
818842
qu8_dwconv_config[1].primary_tile = 25;
819843
#endif
844+
// LINT.ThenChange(:qu8_dwconv_identifier)
820845
}
821846

822847
const struct xnn_dwconv_config* xnn_init_f16_dwconv_config() {

src/configs/dwconv2d-chw-config.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@ XNN_INIT_ONCE_GUARD(f32_dwconv2d_chw);
2828
xnn_log_info("Using dwconv2d_chw microkernel '%s'.", #ukernel);
2929

3030
static void init_f16_dwconv2d_chw_config(void) {
31+
// LINT.IfChange(f16_dwconv2d_chw_config_identifier)
32+
f16_dwconv2d_chw_config.identifier = xnn_create_config_identifier(xnn_config_name_f16_dwconv2d_chw, /*version=*/0);
33+
// LINT.ThenChange(:f16_dwconv2d_chw_config_config)
34+
// LINT.IfChange(:f16_dwconv2d_chw_config_config)
3135
#if XNN_ARCH_ARM && XNN_ENABLE_ARM_FP16_VECTOR && XNN_ENABLE_ARM_FP16_SCALAR
3236
const struct xnn_hardware_config* hardware_config = xnn_init_hardware_config();
3337
assert(hardware_config != NULL);
@@ -69,9 +73,14 @@ static void init_f16_dwconv2d_chw_config(void) {
6973
f16_dwconv2d_chw_config.dwconv2d_chw_5x5s2.output_width_tile = 8;
7074
}
7175
#endif
76+
// LINT.ThenChange(f16_dwconv2d_chw_config_identifier)
7277
}
7378

7479
static void init_f32_dwconv2d_chw_config(void) {
80+
// LINT.IfChange(f32_dwconv2d_chw_config_identifier)
81+
f32_dwconv2d_chw_config.identifier = xnn_create_config_identifier(xnn_config_name_f32_dwconv2d_chw, /*version=*/0);
82+
// LINT.ThenChange(:f32_dwconv2d_chw_config_config)
83+
// LINT.IfChange(:f32_dwconv2d_chw_config_config)
7584
#if XNN_ARCH_ARM
7685
const struct xnn_hardware_config* hardware_config = xnn_init_hardware_config();
7786
assert(hardware_config != NULL);
@@ -218,6 +227,7 @@ static void init_f32_dwconv2d_chw_config(void) {
218227
f32_dwconv2d_chw_config.dwconv2d_chw_5x5s2.init.f32 = xnn_init_f32_minmax_scalar_params;
219228
f32_dwconv2d_chw_config.dwconv2d_chw_5x5s2.output_width_tile = 1;
220229
#endif
230+
// LINT.ThenChange(f32_dwconv2d_chw_config_identifier)
221231
}
222232

223233
const struct xnn_dwconv2d_chw_config* xnn_init_f16_dwconv2d_chw_config() {

0 commit comments

Comments
 (0)