Skip to content

Commit 2ef954b

Browse files
authored
unaryop avx512 mask optimization (#6098)
1 parent 6af6e8a commit 2ef954b

1 file changed

Lines changed: 12 additions & 3 deletions

File tree

src/layer/x86/unaryop_x86.cpp

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,6 @@ static int unary_op_inplace(Mat& a, const Option& opt)
6161
float* ptr = a.channel(q);
6262

6363
int i = 0;
64-
#if __SSE2__
65-
#if __AVX__
6664
#if __AVX512F__
6765
for (; i + 15 < size; i += 16)
6866
{
@@ -71,7 +69,17 @@ static int unary_op_inplace(Mat& a, const Option& opt)
7169
_mm512_storeu_ps(ptr, _p);
7270
ptr += 16;
7371
}
74-
#endif // __AVX512F__
72+
if (i < size)
73+
{
74+
const unsigned int remain = size - i;
75+
__mmask16 _mask = (__mmask16)((1u << remain) - 1);
76+
__m512 _p = _mm512_maskz_loadu_ps(_mask, ptr);
77+
_p = op.func_pack16(_p);
78+
_mm512_mask_storeu_ps(ptr, _mask, _p);
79+
}
80+
#else // __AVX512F__
81+
#if __SSE2__
82+
#if __AVX__
7583
for (; i + 7 < size; i += 8)
7684
{
7785
__m256 _p = _mm256_loadu_ps(ptr);
@@ -93,6 +101,7 @@ static int unary_op_inplace(Mat& a, const Option& opt)
93101
*ptr = op.func(*ptr);
94102
ptr++;
95103
}
104+
#endif // __AVX512F__
96105
}
97106

98107
return 0;

0 commit comments

Comments
 (0)