2016-09-08 4 views
2

私は8台の山車、内部の要素を格納するために使用され__m256を、持っているようなものです:__m256から要素のサブセットを選択しますか?

ここ
__m256 dst = {0,1,2,4,5,6,x,x}; 

X:今、私は次のような値の別の__m256を取得したい

__m256 v = {0,1,2,3,4,5,6,7}; 

私が気にしないことを意味します。

私はSIMDに精通していませんが、誰も助けることができますか?または私にいくつかのヒントを教えてください?

ありがとうございます!

+0

詳細はあなたがSIMD命令をアクセスするために使用しているライブラリに依存しています。私は '__m256'がいくつかのIntelのものを示していると思います。 –

+0

@ Cheersandhth.-Alfはい、私はAVX2までをサポートするIntel CPU上でGCCを使用しています。 – blackball

+0

Intelのドキュメントを見ているかもしれませんか?チュートリアルも必要であると私は確信しています。私はこのようなものを見たことがありません。 –

答えて

3

AVX2組み込みの_mm256_permutevar8x32_psを使用できます。これは、256ビットのベクトル内の要素をシャッフルするのに役立ちます。以下の例を参照してください。

__m256 a = { 10, 20, 30, 40, 50, 60, 70, 80 }; 
__m256i k = _mm256_setr_epi32(0, 1, 2, 4, 5, 6, 0, 0); 
__m256 b = _mm256_permutevar8x32_ps(a, k); 
2

128ビットレーンで動作する命令が必要です。残念ながら、ほとんどのAVX/AVX2シャッフル/置換命令は、256ビットAVXベクトルの2つの128ビットレーン内でしか動作しませんが、この制限がないものはいくつかあります。この特定のケースでは、あなたが探している固有の_mm256_permutevar8x32_psです:

#include <stdio.h> 
#include <immintrin.h> 

int main(void) 
{ 
    __m256 v0 = _mm256_setr_ps(0, 1, 2, 3, 4, 5, 6, 7); 
    __m256i vperm = _mm256_setr_epi32(0, 1, 2, 4, 5, 6, 0, 0); 

    __m256 v1 = _mm256_permutevar8x32_ps(v0, vperm); 

    float f0[8], f1[8]; 

    _mm256_storeu_ps(f0, v0); 
    _mm256_storeu_ps(f1, v1); 

    printf("v0: %g %g %g %g %g %g %g %g\n", f0[0], f0[1], f0[2], f0[3], f0[4], f0[5], f0[6], f0[7]); 
    printf("v1: %g %g %g %g %g %g %g %g\n", f1[0], f1[1], f1[2], f1[3], f1[4], f1[5], f1[6], f1[7]); 

    return 0; 
} 

コンパイルおよびテスト:

$ gcc -Wall -mavx2 blackball.c 
$ ./a.out 
v0: 0 1 2 3 4 5 6 7 
v1: 0 1 2 4 5 6 0 0 
関連する問題