5

可能であれば、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;

これはまったく可能ですか?

4

3 に答える 3

1

私はWindowsでSIMD拡張機能を使用しましたが、Linuxではまだ使用していません。DIVPSそうは言っても、4フロートベクトルを別の4フロートベクトルで除算するSSE操作を利用できるはずです。ただし、doubleを使用しているため、SSE2バージョンが必要になりますDIVPD。私はほとんど忘れていました、-msse2スイッチで構築することを確認してください。

いくつかのSSEGCCビルトインについて詳しく説明しているページを見つけました。少し古いように見えますが、良いスタートになるはずです。

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

于 2010-09-29T23:01:15.960 に答える
1

あなたが探している組み込みはです_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;
}
于 2010-09-30T13:04:49.533 に答える
1

tmp.x *= 0.25;十分ですか?

SSE 命令 (使用する場合) については、次のことが重要であることに注意してください。

1) すべてのメモリ アクセスは 16 バイト アライグされます

2) 操作はループで実行されます

3) int <-> float または float <-> double 変換は実行されません。

4) できれば分割を避ける

于 2010-09-29T22:56:37.737 に答える