rewrite of f32 fma, and other optmization of simd kernel ops
This commit is contained in:
@@ -1,5 +1,27 @@
|
||||
#include "sn_intrinsic.h"
|
||||
|
||||
INTERNAL void SN_DECL f32_fill_sse(MAT_KERNEL(float) *restrict dest, scalar_pack *scaler)
|
||||
{
|
||||
register __m128 vec = _mm_set_ps1(((float *)(scaler->data))[0]);
|
||||
dest->xmm[0] = vec;
|
||||
dest->xmm[1] = vec;
|
||||
dest->xmm[2] = vec;
|
||||
dest->xmm[3] = vec;
|
||||
}
|
||||
|
||||
INTERNAL void SN_DECL f32_fill_avx(MAT_KERNEL(float) *restrict dest, scalar_pack *scaler)
|
||||
{
|
||||
register __m256 vec = _mm256_broadcast_ss(((float *)(scaler->data)));
|
||||
dest->ymm[0] = vec;
|
||||
dest->ymm[1] = vec;
|
||||
}
|
||||
|
||||
INTERNAL void SN_DECL f32_fill_512(MAT_KERNEL(float) *restrict dest, scalar_pack *scaler)
|
||||
{
|
||||
register __m512 vec = _mm512_broadcastss_ps(((__m128 *)(scaler->data))[0]);
|
||||
dest->zmm[0] = vec;
|
||||
}
|
||||
|
||||
INTERNAL void SN_DECL f32_add_sse(MAT_KERNEL(float) const *left, MAT_KERNEL(float) const *right,
|
||||
MAT_KERNEL(float) *restrict ans)
|
||||
{
|
||||
@@ -106,11 +128,10 @@ INTERNAL void SN_DECL f32_transpose_512(MAT_KERNEL(float) const *source,
|
||||
target->zmm[0] = _mm512_permutexvar_ps(transpose_indices, matrix);
|
||||
}
|
||||
|
||||
INTERNAL void SN_DECL f32_scalar_mul_sse(MAT_KERNEL(float) const *matrix, float const scalar,
|
||||
MAT_KERNEL(float) *restrict ans)
|
||||
INTERNAL void SN_DECL f32_scalar_mul_sse(MAT_KERNEL(float) const *matrix,
|
||||
MAT_KERNEL(float) *restrict ans, scalar_pack const *scalar)
|
||||
{
|
||||
register __m128 temp = _mm_load_ss(&scalar);
|
||||
register __m128 scalar_vec = _mm_shuffle_ps(temp, temp, _MM_SHUFFLE(0, 0, 0, 0));
|
||||
register __m128 scalar_vec = ((__m128 *)(scalar->data))[0];
|
||||
|
||||
register __m128 c0 = _mm_mul_ps(matrix->xmm[0], scalar_vec);
|
||||
register __m128 c1 = _mm_mul_ps(matrix->xmm[1], scalar_vec);
|
||||
@@ -123,10 +144,10 @@ INTERNAL void SN_DECL f32_scalar_mul_sse(MAT_KERNEL(float) const *matrix, float
|
||||
ans->xmm[3] = c3;
|
||||
}
|
||||
|
||||
INTERNAL void SN_DECL f32_scalar_mul_avx(MAT_KERNEL(float) const *matrix, float const scalar,
|
||||
MAT_KERNEL(float) *restrict ans)
|
||||
INTERNAL void SN_DECL f32_scalar_mul_avx(MAT_KERNEL(float) const *matrix,
|
||||
MAT_KERNEL(float) *restrict ans, scalar_pack const *scalar)
|
||||
{
|
||||
register __m256 scalar_vec = _mm256_broadcast_ss(&scalar);
|
||||
register __m256 scalar_vec = ((__m256 *)(scalar->data))[0];
|
||||
|
||||
register __m256 c0 = _mm256_mul_ps(matrix->ymm[0], scalar_vec);
|
||||
register __m256 c1 = _mm256_mul_ps(matrix->ymm[1], scalar_vec);
|
||||
@@ -135,10 +156,10 @@ INTERNAL void SN_DECL f32_scalar_mul_avx(MAT_KERNEL(float) const *matrix, float
|
||||
ans->ymm[1] = c1;
|
||||
}
|
||||
|
||||
INTERNAL void SN_DECL f32_scalar_mul_512(MAT_KERNEL(float) const *matrix, float const scalar,
|
||||
MAT_KERNEL(float) *restrict ans)
|
||||
INTERNAL void SN_DECL f32_scalar_mul_512(MAT_KERNEL(float) const *matrix,
|
||||
MAT_KERNEL(float) *restrict ans, scalar_pack const *scalar)
|
||||
{
|
||||
__m512 scalar_vec = _mm512_broadcastss_ps(_mm_load_ss(&scalar));
|
||||
register __m512 scalar_vec = ((__m512 *)(scalar->data))[0];
|
||||
|
||||
register __m512 c0 = _mm512_mul_ps(matrix->zmm[0], scalar_vec);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user