作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 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;
}
最佳答案
你得到了正确的结果。见 Intel® Advanced Vector Extensions Programming Reference ,第 320-333 页。
几乎没有 AVX 指令跨越 128 位边界,它们中的大多数作为 SSE 指令分别用于每个低 128 位和高 128 位。很不幸。
关于intrinsics - 来自 AVX _m256_unpack*_ps 内在解包的意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6687535/
我正在尝试使用 AVX 内在解包指令 _m256_unpacklo_ps和 _m256_unpackhi_ps交错 16 个浮点值。我得到的结果很奇怪,要么是因为我不明白解包在 AVX 中应该如何工作
我是一名优秀的程序员,十分优秀!