SIMD(SSE)指令在GCC中进行划分

如果可能,我想使用SSE指令优化以下片段:

/*
 * the data structure
 */
typedef struct v3d v3d;
struct v3d {
    double x;
    double y;
    double z;
} tmp = { 1.0, 2.0, 3.0 };

/*
 * the part that should be "optimized"
 */
tmp.x /= 4.0;
tmp.y /= 4.0;
tmp.z /= 4.0;

这可能吗?


我在Windows下使用了SIMD扩展,但还没有在linux下。 这就是说你应该能够利用DIVPS SSE操作,该操作会将4浮点向量除以另一个4浮点向量。 但是你正在使用双打,所以你需要SSE2版本DIVPD 。 我差点忘了,确保使用-msse2开关构建。

我找到了一个详细介绍一些SSE GCC内置的页面。 它看起来有点古老,但应该是一个好的开始。

http://ds9a.nl/gcc-simd/


tmp.x *= 0.25; 足够?

请注意,对于SSE指令(如果您想使用它们),重要的是:

1)所有的内存访问都是16字节的alighed

2)操作在循环中执行

3)不执行int < - > float或float < - >双重转换

4)尽可能避免分裂


你正在寻找的内在是_mm_div_pd 。 这是一个应该足以引导你朝正确方向发展的实例:

#include <stdio.h>

#include <emmintrin.h>

typedef struct
{
    double x;
    double y;
    double z;
} v3d;

typedef union __attribute__ ((aligned(16)))
{
    v3d a;
    __m128d v[2];
} u3d;

int main(void)
{
    const __m128d vd = _mm_set1_pd(4.0);
    u3d u = { { 1.0, 2.0, 3.0 } };

    printf("v (before) = { %g %g %g }n", u.a.x, u.a.y, u.a.z);

    u.v[0] = _mm_div_pd(u.v[0], vd);
    u.v[1] = _mm_div_pd(u.v[1], vd);

    printf("v (after) = { %g %g %g }n", u.a.x, u.a.y, u.a.z);

    return 0;
}
链接地址: http://www.djcxy.com/p/85645.html

上一篇: SIMD (SSE) instruction for division in GCC

下一篇: Fast vectorized rsqrt and reciprocal with SSE/AVX depending on precision