Skip to content

Commit aef88b7

Browse files
author
Fomenko, Evarist M
committed
src: cpu: avoid static initialization order fiasco in bf16 converters
1 parent 1a5eca7 commit aef88b7

File tree

2 files changed

+28
-13
lines changed

2 files changed

+28
-13
lines changed

src/cpu/bfloat16_utils.cpp

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,25 @@ namespace impl {
2121
namespace cpu {
2222
namespace bf16_cvt_utils {
2323

24-
jit_avx512_core_cvt_ps_to_bf16_t cvt_one_ps_to_bf16(1);
25-
jit_avx512_core_cvt_ps_to_bf16_t cvt_ps_to_bf16_;
26-
jit_avx512_core_cvt_bf16_to_ps_t cvt_bf16_to_ps_;
27-
jit_avx512_core_add_cvt_ps_to_bf16_t add_cvt_ps_to_bf16_;
24+
jit_avx512_core_cvt_ps_to_bf16_t &cvt_one_ps_to_bf16() {
25+
static jit_avx512_core_cvt_ps_to_bf16_t singleton(1);
26+
return singleton;
27+
}
28+
29+
jit_avx512_core_cvt_ps_to_bf16_t &cvt_ps_to_bf16_() {
30+
static jit_avx512_core_cvt_ps_to_bf16_t singleton;
31+
return singleton;
32+
}
33+
34+
jit_avx512_core_cvt_bf16_to_ps_t &cvt_bf16_to_ps_() {
35+
static jit_avx512_core_cvt_bf16_to_ps_t singleton;
36+
return singleton;
37+
}
38+
39+
jit_avx512_core_add_cvt_ps_to_bf16_t &add_cvt_ps_to_bf16_() {
40+
static jit_avx512_core_add_cvt_ps_to_bf16_t singleton;
41+
return singleton;
42+
}
2843

2944
}
3045
}

src/cpu/bfloat16_utils.hpp

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -30,18 +30,18 @@ union f32_bf16_t {
3030
mkldnn_bfloat16_t vbfloat[2];
3131
};
3232

33-
extern jit_avx512_core_cvt_ps_to_bf16_t cvt_one_ps_to_bf16;
34-
extern jit_avx512_core_cvt_ps_to_bf16_t cvt_ps_to_bf16_;
35-
extern jit_avx512_core_cvt_bf16_to_ps_t cvt_bf16_to_ps_;
36-
extern jit_avx512_core_add_cvt_ps_to_bf16_t add_cvt_ps_to_bf16_;
33+
jit_avx512_core_cvt_ps_to_bf16_t &cvt_one_ps_to_bf16();
34+
jit_avx512_core_cvt_ps_to_bf16_t &cvt_ps_to_bf16_();
35+
jit_avx512_core_cvt_bf16_to_ps_t &cvt_bf16_to_ps_();
36+
jit_avx512_core_add_cvt_ps_to_bf16_t &add_cvt_ps_to_bf16_();
3737

3838
inline mkldnn_bfloat16_t cvt_float_to_bfloat16(float inp) {
3939
assert(mayiuse(avx512_core));
4040
mkldnn_bfloat16_t out;
4141
jit_call_t p;
4242
p.inp = (void *)&inp;
4343
p.out = (void *)&out;
44-
cvt_one_ps_to_bf16.jit_ker(&p);
44+
cvt_one_ps_to_bf16().jit_ker(&p);
4545
return out;
4646
}
4747

@@ -50,7 +50,7 @@ inline void cvt_float_to_bfloat16(mkldnn_bfloat16_t *out, const float *inp) {
5050
jit_call_t p;
5151
p.inp = (void *)inp;
5252
p.out = (void *)out;
53-
cvt_one_ps_to_bf16.jit_ker(&p);
53+
cvt_one_ps_to_bf16().jit_ker(&p);
5454
}
5555

5656
inline void cvt_float_to_bfloat16(mkldnn_bfloat16_t *out, const float *inp,
@@ -60,7 +60,7 @@ inline void cvt_float_to_bfloat16(mkldnn_bfloat16_t *out, const float *inp,
6060
p_.inp = (void *)inp;
6161
p_.out = (void *)out;
6262
p_.size = size;
63-
cvt_ps_to_bf16_.jit_ker(&p_);
63+
cvt_ps_to_bf16_().jit_ker(&p_);
6464
}
6565

6666
inline float cvt_bfloat16_to_float(mkldnn_bfloat16_t inp) {
@@ -84,7 +84,7 @@ inline void cvt_bfloat16_to_float(float *out, const mkldnn_bfloat16_t *inp,
8484
p_.inp = (void *)inp;
8585
p_.out = (void *)out;
8686
p_.size = size;
87-
cvt_bf16_to_ps_.jit_ker(&p_);
87+
cvt_bf16_to_ps_().jit_ker(&p_);
8888
}
8989

9090
// performs element-by-element sum of inp and add float arrays and stores
@@ -99,7 +99,7 @@ inline void add_floats_and_cvt_to_bfloat16(mkldnn_bfloat16_t *out,
9999
p_.add = (void *)inp1;
100100
p_.out = (void *)out;
101101
p_.size = size;
102-
add_cvt_ps_to_bf16_.jit_ker(&p_);
102+
add_cvt_ps_to_bf16_().jit_ker(&p_);
103103
}
104104

105105
inline mkldnn_bfloat16_t approx_bfloat16_lowest() {

0 commit comments

Comments
 (0)