tract_linalg/x86_64/
act_f16.rs1use tract_data::internal::f16;
12
13const CHUNK: usize = 256;
14
15const SILU_CHUNK: usize = 1024;
24
25#[cfg(target_arch = "x86_64")]
32#[target_feature(enable = "avx512f")]
33unsafe fn cvt_f16_to_f32(src: &[f16], dst: &mut [f32]) {
34 use core::arch::x86_64::*;
35 let n = src.len();
36 debug_assert!(dst.len() >= n);
37 let chunks = n / 16;
38 unsafe {
39 for k in 0..chunks {
40 let m = _mm256_loadu_si256(src.as_ptr().add(k * 16) as *const __m256i);
41 let z = _mm512_cvtph_ps(m);
42 _mm512_storeu_ps(dst.as_mut_ptr().add(k * 16), z);
43 }
44 for k in (chunks * 16)..n {
45 *dst.get_unchecked_mut(k) = src.get_unchecked(k).to_f32();
46 }
47 }
48}
49
50bail_stub!(x86_64; unsafe fn cvt_f16_to_f32(&[f16], &mut [f32]));
51
52#[cfg(target_arch = "x86_64")]
53#[target_feature(enable = "avx512f")]
54unsafe fn cvt_f32_to_f16(src: &[f32], dst: &mut [f16]) {
55 use core::arch::x86_64::*;
56 let n = src.len();
57 debug_assert!(dst.len() >= n);
58 let chunks = n / 16;
59 unsafe {
60 for k in 0..chunks {
61 let z = _mm512_loadu_ps(src.as_ptr().add(k * 16));
62 let m = _mm512_cvtps_ph::<0>(z);
64 _mm256_storeu_si256(dst.as_mut_ptr().add(k * 16) as *mut __m256i, m);
65 }
66 for k in (chunks * 16)..n {
67 *dst.get_unchecked_mut(k) = f16::from_f32(*src.get_unchecked(k));
68 }
69 }
70}
71
72bail_stub!(x86_64; unsafe fn cvt_f32_to_f16(&[f32], &mut [f16]));
73
74routine_ew_via_f32!(x86_64;
76 x86_64_avx512_hardswish_f16_64n,
77 64,
78 32,
79 CHUNK,
80 64,
81 cvt_f16_to_f32,
82 cvt_f32_to_f16,
83 super::act::x86_64_avx512_hardswish_f32_64n,
84 func(Hardswish),
85 isa(X86_64Avx512f)
86);
87
88routine_ew_via_f32!(x86_64;
89 x86_64_avx512_leaky_relu_f16_64n,
90 64,
91 32,
92 CHUNK,
93 64,
94 cvt_f16_to_f32,
95 cvt_f32_to_f16,
96 super::act::x86_64_avx512_leaky_relu_f32_64n,
97 func(LeakyRelu),
98 param(alpha => alpha.to_f32()),
99 isa(X86_64Avx512f)
100);
101
102routine_ew_via_f32!(x86_64;
103 x86_64_avx512_sigmoid_f16_16n,
104 16,
105 16,
106 CHUNK,
107 64,
108 cvt_f16_to_f32,
109 cvt_f32_to_f16,
110 super::avx512_sigmoid_f32,
111 func(Sigmoid),
112 isa(X86_64Avx512f)
113);
114
115routine_ew_via_f32!(x86_64;
116 x86_64_avx512_tanh_f16_16n,
117 16,
118 16,
119 CHUNK,
120 64,
121 cvt_f16_to_f32,
122 cvt_f32_to_f16,
123 super::avx512_tanh_f32,
124 func(Tanh),
125 isa(X86_64Avx512f)
126);
127
128routine_ew_via_f32!(x86_64;
129 x86_64_avx512_silu_f16_16n,
130 16,
131 16,
132 SILU_CHUNK,
133 64,
134 cvt_f16_to_f32,
135 cvt_f32_to_f16,
136 super::avx512_silu_f32,
137 func(Silu),
138 isa(X86_64Avx512f)
139);
140
141routine_ew_via_f32!(x86_64;
142 x86_64_avx512_gelu_f16_16n,
143 16,
144 16,
145 CHUNK,
146 64,
147 cvt_f16_to_f32,
148 cvt_f32_to_f16,
149 super::act::x86_64_avx512_gelu_f32_16n,
150 func(Gelu),
151 isa(X86_64Avx512f)
152);