4

_m256_unpacklo_psAVX 組み込みのアンパック命令を使用して、 _m256_unpackhi_ps16 個の float 値をインターリーブしようとしています。AVX でアンパックがどのように機能するかを理解していないか、何かが正常に機能していないため、得られた結果は奇妙です。

私が見ているのは、たとえば、2 つのベクトル v1 と v2 から低次浮動小数点数を 3 番目の v3 にアンパックしようとすると、次のように表示されることです。

v1 が [a b c d e f g h] v1 の場合[i j k l m n o p]

その後v3 = _m256_unpacklo_ps(v1, v2)[a i b j e m f n]

v3が与えると思ったとき[a i b j c k d l]

私の期待は間違っていますか、それともこれを間違って使用していますか? それとも他の何かが故障していますか?

テストコードは次のとおりです。

#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

2 に答える 2

4

正しい結果が得られています。Intel® Advanced Vector Extensions Programming Reference、ページ 320-333 を参照してください。

128 ビット境界を超える AVX 命令はほとんどなく、それらのほとんどは、下位および上位の 128 ビットごとに個別に SSE 命令として機能します。非常に残念です。

于 2011-07-14T03:03:37.750 に答える
3

期待どおりに動作しています。

[aibjckdl] を取得するには、以下を使用する必要があります。

A = unpacklo_ps(v1,v2)

B = unpackhi_ps(v1,v2)そして使用する

C=_mm256_permute2f128_ps(A,B,0x20)

両方から目的の 128 ビットを取得します。

于 2012-12-02T07:45:23.167 に答える