簡體   English   中英

用於GCC划分的SIMD(SSE)指令

[英]SIMD (SSE) instruction for division in 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;

這有可能嗎?

tmp.x *= 0.25; 足夠?

請注意,對於SSE指令(如果您要使用它們),重要的是:

1)所有內存訪問都是16字節對齊

2)操作在循環中執行

3)沒有int < - > float或float < - >執行雙重轉換

4)盡可能避免分裂

我在windows下使用了SIMD擴展,但還沒有在linux下。 話雖這么說你應該能夠利用DIVPS SSE操作,它將4浮點向量除以另外4個浮點向量。 但是你正在使用雙打,所以你需要SSE2版本的DIVPD 我差點忘了,確保用-msse2開關構建。

我找到了一個頁面,詳細介紹了一些SSE GCC內置版本。 它看起來有點舊,但應該是一個好的開始。

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

您正在尋找的內在因素是_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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM