小编use*_*740的帖子

为什么矢量长度SIMD代码比普通C慢

为什么我的SIMD vector4长度函数比单纯的向量长度方法慢3倍?

SIMD vector4长度函数:

__extern_always_inline float vec4_len(const float *v) {
    __m128 vec1 = _mm_load_ps(v);
    __m128 xmm1 = _mm_mul_ps(vec1, vec1);
    __m128 xmm2 = _mm_hadd_ps(xmm1, xmm1);
    __m128 xmm3 = _mm_hadd_ps(xmm2, xmm2);
    return sqrtf(_mm_cvtss_f32(xmm3));
}
Run Code Online (Sandbox Code Playgroud)

天真的实现:

sqrtf(V[0] * V[0] + V[1] * V[1] + V[2] * V[2] + V[3] * V[3])
Run Code Online (Sandbox Code Playgroud)

SIMD版本花费了16110ms来迭代10亿次。天真的版本快了约3倍,只花了4746ms。

#include <math.h>
#include <time.h>
#include <stdint.h>
#include <stdio.h>
#include <x86intrin.h>

static float vec4_len(const float *v) {
    __m128 vec1 = _mm_load_ps(v);
    __m128 xmm1 = _mm_mul_ps(vec1, vec1);
    __m128 xmm2 = _mm_hadd_ps(xmm1, xmm1);
    __m128 …
Run Code Online (Sandbox Code Playgroud)

c sse simd compiler-optimization microbenchmark

2
推荐指数
1
解决办法
245
查看次数

标签 统计

c ×1

compiler-optimization ×1

microbenchmark ×1

simd ×1

sse ×1