2011-07-14 22 views
4

AVXのintrinsicアンパック命令_m256_unpacklo_ps_m256_unpackhi_psを使用して、16個の浮動小数点値をインターリーブしようとしています。私が得ている結果は、アンパックがAVXでどのように動作するはずか、何かがうまく動作しないために理解できないために、奇妙です。AVX _m256_unpack * _psの予期せぬ結果が組み込まれています

私は何を見ていることは、私は、例えば、低次は第三、V3に2つのベクトルv1とv2から浮いて解凍しようとしたとき、私は以下を参照してくださいということです。

V1がある場合[a b c d e f g h] とV1は、私はV3が[a i b j c k d l]

を与えることが期待さ [a i b j e m f n]

[i j k l m n o p]

その後、v3 = _m256_unpacklo_ps(v1, v2)結果です

私の予想は間違っていますか、これを間違って使用していますか?それとも、何か他のものが誤動作していますか?

いくつかのテストコードは次のとおりです。

#include <immintrin.h> 
#include <iostream> 

int main() 
{ 

    float output[16], input1[8], input2[8]; 
    __m256 vec1, vec2, vec3, vec4; 

    vec1 = _mm256_set_ps(1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f); 
    vec2 = _mm256_set_ps(9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, 16.0f); 

    _mm256_store_ps(input1, vec1); 
    _mm256_store_ps(input2, vec2); 

    vec3 = _mm256_unpacklo_ps(vec1, vec2); 
    vec4 = _mm256_unpackhi_ps(vec1, vec2); 

    _mm256_store_ps(output, vec3); 
    _mm256_store_ps(output + 8, vec4); 

    std::cout << "interleaving:" << std::endl; 
    for (unsigned i = 0; i < 8; ++i) 
    std::cout << input1[i] << " "; 
    std::cout << std::endl; 

    std::cout << "with:" << std::endl; 
    for (unsigned i = 0; i < 8; ++i) 
    std::cout << input2[i] << " "; 
    std::cout << std::endl; 

    std::cout << "= " << std::endl; 
    for (unsigned i = 0; i < 16; ++i) 
    std::cout << output[i] << " "; 
    std::cout << std::endl; 
} 

私はコンパイルにはgcc 4.5.2を使用しています。

ありがとうございました! - ジャスティン

答えて

4

あなたは正しい結果を得ています。 Intel® Advanced Vector Extensions Programming Reference、page 320-333を参照してください。

ほとんどのAVX命令は128ビットの境界を横切りません。ほとんどの命令は、低位と高位の128ビットごとにSSE命令として動作します。非常に不幸です。

3

予想通りに動作しています。

[I BはjのC kはD 1]取得するには、使用する必要があります:

A = unpacklo_ps(v1,v2) 

B = unpackhi_ps(v1,v2)し、それらの両方から目的の128ビットを得るために

C=_mm256_permute2f128_ps(A,B,0x20)

を使用しています。

+0

そして残りの半分を取得するには、使用_mm256_permute2f128_ps(A、B、0x31) –

関連する問題