此问题已在此处有答案:
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
吗?
1条答案
按热度按时间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