【发布时间】:2019-07-16 11:01:07
【问题描述】:
我有两个 4 分量向量,我将它们加载到两个 __m128 变量中。
然后我需要洗牌,使结果看起来像这样:
给定:
__m128 mmMin = _mm_load_ps(&glm::vec4(-1.0f,-2.0f,-3.0f,-4.0f)[0]);
__m128 mmMax = _mm_load_ps(&glm::vec4(1.0f,2.0f,3.0f,4.0f)[0]);
我希望随机播放的结果如下所示:
// {mmMin.x,mmMax.x,mmMin.x,mmMax.x}
但我认为_mm_shuffle_ps 是不可能的。
来自SSE docs 我看到_mm_shuffle_ps 总是戴着面具
首先从 __m128 的低 2 个分量插入结果 2 个值,然后从高 2 个分量插入 2 个值。
SPU 内部函数具有si_shufb 方法,该方法允许定义基于qword 的掩码并随机播放我希望的任何位置。 SSE有类似的方法吗?
我正在使用 SSE2,但也很高兴看到它可以如何与其他版本(包括 AVX)一起使用。
【问题讨论】:
-
可能最多可以使用 SSE4,但更喜欢保持在 SSE2 级别。
-
你检查gcc的
__builtin_shuffle或clang的__builtin_shufflevector生成什么了吗? -
有那个功能。有什么功能?
.x是哪个成员?您可能需要unpcklps,然后是movsldup或unpcklpd来复制下半部分。 (或shufps same,same,但在旧 CPU 上可能会更慢,并且 AVX 版本需要额外的字节)。要在 1 次随机播放中执行此操作,您可能需要 AVX512Fvpermt2ps。 (这些指令都有内在函数,但助记符更容易记住和输入)。在 AVX512F 之前没有 2 输入可变控制随机播放,我认为任何固定随机播放都不够灵活,shufps是最接近的。