【问题标题】:Unexpected result from AVX _m256_unpack*_ps unpack intrinsic来自 AVX _m256_unpack*_ps unpack 内在的意外结果
【发布时间】:2011-07-14 01:32:08
【问题描述】:

我正在尝试使用 AVX 内在解包指令 _m256_unpacklo_ps_m256_unpackhi_ps 交错 16 个浮点值。我得到的结果很奇怪,要么是因为我不了解解包在 AVX 中应该如何工作,要么是因为某些东西没有按应有的方式工作。

我看到的是,例如,当我尝试将低阶浮点数从两个向量 v1 和 v2 解压缩到第三个向量 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 编译。

提前感谢您的帮助! - 贾斯汀

【问题讨论】:

    标签: intrinsics unpack avx


    【解决方案1】:

    你得到了正确的结果。参见Intel® Advanced Vector Extensions Programming Reference,第 320-333 页。

    几乎没有 AVX 指令跨越 128 位边界,它们中的大多数分别作为每个低 128 位和高 128 位的 SSE 指令工作。非常不幸。

    【讨论】:

      【解决方案2】:

      它的行为符合预期。

      要获得 [a i b j c k d l],您需要使用:

      A = unpacklo_ps(v1,v2)
      

      B = unpackhi_ps(v1,v2) 然后使用

      C=_mm256_permute2f128_ps(A,B,0x20),

      从两者中获取所需的 128 位。

      【讨论】:

      • 要获得另一半,请使用 _mm256_permute2f128_ps(A,B,0x31)
      猜你喜欢
      • 2014-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-27
      • 2015-11-02
      相关资源
      最近更新 更多