Skip to content

Commit 67e8cd2

Browse files
kwierschvpirogov
authored andcommitted
cpu: jit: avx512: check code size against upper bound
1 parent 5414333 commit 67e8cd2

File tree

2 files changed

+31
-0
lines changed

2 files changed

+31
-0
lines changed

src/cpu/jit_avx512_common_conv_kernel.cpp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1322,6 +1322,7 @@ status_t jit_avx512_common_conv_fwd_kernel::init_conf(
13221322
if (jcp.l_pad > 0 && r_pad > 0)
13231323
n_oi--;
13241324

1325+
// Heuristic to optimize code size on KNX
13251326
bool large_code_size = jcp.ur_w != jcp.ow && jcp.l_pad > 0 && r_pad > 0
13261327
&& ((jcp.l_pad <= 0 && n_oi > 0) || (jcp.l_pad > 0 && n_oi > 1));
13271328
if (large_code_size) {
@@ -1597,6 +1598,18 @@ status_t jit_avx512_common_conv_fwd_kernel::init_conf(
15971598
}
15981599
}
15991600

1601+
// A rough check on code size
1602+
// TODO: come up with a tighter bound
1603+
{
1604+
const int max_code_size = 256 * 1024; // default size of jit generator
1605+
int mult = 1 + (jcp.l_pad > 0) + (r_pad > 0);
1606+
const float max_instruction_size = 15;
1607+
float ur_fac
1608+
= (float)jcp.kw * jcp.ic_block * jcp.nb_oc_blocking * jcp.ur_w;
1609+
float code_size = mult * ur_fac * max_instruction_size;
1610+
if (code_size > max_code_size) return status::unimplemented;
1611+
}
1612+
16001613
return status::success;
16011614
}
16021615

@@ -2368,6 +2381,7 @@ status_t jit_avx512_common_conv_bwd_data_kernel_f32::init_conf(
23682381

23692382
jcp.loop_order = loop_gnc;
23702383

2384+
// Heuristic to optimize code size on KNX
23712385
bool large_code_size = (jcp.ur_w != jcp.ow)
23722386
&& ((l_overflow <= 0 && n_oi > 0) ||(l_overflow > 0 && n_oi > 1))
23732387
&& (r_overflow1 > 0) && (l_overflow > 0);
@@ -2469,6 +2483,18 @@ status_t jit_avx512_common_conv_bwd_data_kernel_f32::init_conf(
24692483
&& jcp.oc <= weights_d.padded_dims()[with_groups + 0];
24702484
if (!args_ok) return status::unimplemented;
24712485

2486+
// A rough check on code size
2487+
// TODO: come up with a tighter bound
2488+
{
2489+
const int max_code_size = 256 * 1024; // default size of jit generator
2490+
int mult = 1 + (l_overflow > 0) + (r_overflow1 > 0);
2491+
const float max_instruction_size = 15;
2492+
float ur_fac
2493+
= (float)jcp.kw * jcp.oc_block * jcp.nb_ic_blocking * jcp.ur_w;
2494+
float code_size = mult * ur_fac * max_instruction_size;
2495+
if (code_size > max_code_size) return status::unimplemented;
2496+
}
2497+
24722498
return status::success;
24732499
}
24742500

tests/benchdnn/inputs/test_conv_regression_general

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,3 +84,8 @@ mb1_g2ic22oc32_ih8oh6kh3sh1dh0ph0_iw8ow6kw3sw1dw0pw0
8484
#MFDNN-1707
8585
--reset --mb=1 --dir=FWD_D --cfg=f32
8686
mb1_g2ic6oc16_ih5oh5kh1sh1dh0ph0_iw5ow5kw1sw1dw0pw0
87+
88+
# Code too big error
89+
--reset --mb=1 --dir=FWD_D,BWD_D --cfg=f32
90+
mb1_ic16oc16_iw80ow80kw31sw1dw0pw15
91+

0 commit comments

Comments
 (0)