c++ avx2压缩的单个向量的移位值[重复]

jfewjypa  于 2023-06-07  发布在  其他
关注(0)|答案(1)|浏览(171)

此问题已在此处有答案

Shuffle AVX 256 Vector elements by 1 position left/right - C intrinsics(1个答案)
Shifting SSE/AVX registers 32 bits left and right while shifting in zeros(2个答案)
7天前关闭
我试图在C++中使用avx2 intrinsic对压缩的单个向量执行右移操作,但无法使其工作。

float data[8] = {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f};
auto vec = _mm256_load_ps(data);
auto vec2 = foo(vec); // use avx intrinsics to implement foo
_mm256_store_ps(data, vec2);

完成此操作后,我希望data包含以下值

{X, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f}

其中X是一个任意值,我不关心它是否对应于循环移位,零填充或一些未定义的值填充,只要它是快速的。
有人能帮助我使用avx2 intrinsic有效地实现foo吗?

tkclm6bt

tkclm6bt1#

如果没有明确定义浮点数'data'数组为32字节对齐,则应使用_mm256_loadu_ps和_mm256_storeu_ps。可以使用_mm256_permutevar8x32_ps()将数据向右旋转4个字节。请访问https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#techs=AVX_ALL&IG_expand= 6144,4986,以获取SIMD内部函数的有用参考。我想这样的东西应该能很有效地解决问题。我仍然在旧的硬件上,没有AVX 2,所以我不能测试这个,但如果实际代码不是,这个想法是有效的。:D

__m256i idx = _mm256_setr_epi32(7, 0, 1, 2, 3, 4, 5, 6);
vec2 = _mm256_permutevar8x32_ps(vec, idx);

相关问题