ベクトルのアクセス要素にGCC SSEベクトルの拡張機能を使用してどのように - C

StackOverflow https://stackoverflow.com/questions/1771945

  •  21-09-2019
  •  | 
  •  

質問

次のタイプを使用して3Dベクトルと通常I仕事ます:

typedef vec3_t float[3];

なめらかを使用してベクトルを初期化します。同様ます:

vec3_t x_basis = {1.0, 0.0, 0.0};
vec3_t y_basis = {0.0, 1.0, 0.0};
vec3_t z_basis = {0.0, 0.0, 1.0};

となめらかを使用してそれらにアクセスします。同様ます:

x_basis[X] * y_basis[X] + ...

今、私はSSE命令を使用して、ベクトル算術演算を必要としています。私は、コードを次ています:

typedef float v4sf __attribute__ ((mode(V4SF)))
int main(void)
{
    v4sf   a,b,c;
    a = (v4sf){0.1f,0.2f,0.3f,0.4f};
    b = (v4sf){0.1f,0.2f,0.3f,0.4f};
    c = (v4sf){0.1f,0.2f,0.3f,0.4f};
    a = b + c;
    printf("a=%f \n", a);
    return 0;
}

GCCは、このような方法をサポートしています。しかし... まず、それは私に、結果として0.00000を与えます。第二に、私はこのようなベクターの要素にアクセスすることはできません。 私の質問は:どのように私は、このようなベクトルの要素にアクセスすることができますか?私はなめらかにする必要があります。など。

アクセスY要素にアクセスX要素に[0]、[1]、等

PS:私が使用してこのコードをコンパイルします:

gcc -msse testgcc.c -o testgcc
役に立ちましたか?

解決

要素にアクセスするための安全かつ推奨される方法ではなく、コンパイラのエイリアシング検出機構を愚か者と不安定なコードにつながる可能性がポインタ型punningの、組合である。

union Vec4 {
    v4sf v;
    float e[4];
};

Vec4 vec;
vec.v = (v4sf){0.1f,0.2f,0.3f,0.4f};
printf("%f %f %f %f\n", vec.e[0], vec.e[1], vec.e[2], vec.e[3]);

他のヒント

注GCC 4.6今その支持体は添字ベクトルをを:

  ベクターは、要素および基本型の同じ数の配列であるかのように、

はCベクトルは添字することができます。実行時に未定義の動作ボークバウンドのアクセスのうち。ベクトルサブスクリプションのバウンドのアクセスのうちのための警告は-Warray-範囲で有効にすることができます。

あなたはfloatの配列としてaを再解釈する必要があることを忘れています。適切にコードの動作を以下に示します。

int main(){
    v4sf a,b,c;
    a = (v4sf){0.1f,0.2f,0.3f,0.4f};
    b = (v4sf){0.1f,0.2f,0.3f,0.4f};
    c = (v4sf){0.1f,0.2f,0.3f,0.4f};
    a = b + c;
    float* pA = (float*) &a;
    printf("a=[%f %f %f %f]\n",pA[0], pA[1], pA[2], pA[3]);
    return 0;
}

P.S。:この質問のおかげで、私はgccが、このようなSSEをサポートしている知りませんでした。

UPDATE:配列が整列していないだと、このソリューションは失敗します。 @drhirshが提供するソリューションは、この問題から解放されます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top