【问题标题】:Equivalent of SSE unpacklo_ps/unpackhi_ps in AVX (for doubles)AVX 中 SSE unpacklo_ps/unpackhi_ps 的等价物(双打)
【发布时间】:2012-11-17 03:36:29
【问题描述】:

在 SSE 中,如果我有一个包含 4 个浮点数的 128 位寄存器,即

A = a b c d ('a','b','c','d' are floats and 'A' is a 128-bit SSE register)

B = e f g h

如果我愿意的话

C = a e b f

我可以这样做:

C = _mm_unpacklo_ps(A,B);

如果我愿意也可以

D = c g d h

我能做到:

D = _mm_unpackhi_ps(A,B);

如果我有一个包含双精度的 AVX 寄存器,是否可以用一条指令来做同样的事情?

根据这些内在函数的工作原理,我知道我不能使用 _mm256_unpacklo_pd()_mm256_shuffle_pd()_mm256_permute2f128_pd()_mm256_blend_pd()。除了这些我可以使用任何指令还是我必须使用上述指令的组合?

【问题讨论】:

    标签: c sse avx


    【解决方案1】:

    我能想到的一种方法如下:

    A1 = _mm256_unpacklo_pd(A,B);
    A2 = _mm256_unpackhi_pd(A,B);
    
    C = _mm256_permute2f128_pd(A1,A2,0x20);
    D = _mm256_permute2f128_pd(A1,A2,0x31);
    

    如果有人有更好的解决方案,请在下面发布。

    【讨论】:

    • 我不认为你会做得比这更好。由于您希望值在此过程中跨越 128 位边界,我认为您将不得不使用 128 位置换函数之一。这只是 AVX 的局限之一。即将推出的 Haswell x86 处理器系列中支持的 AVX2 更加灵活,因为它将支持任意位置到任意位置的置换操作,但我仍然不确定它是否会产生更短的指令序列。
    猜你喜欢
    • 2018-01-04
    • 2015-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-29
    • 2015-04-06
    • 2019-11-03
    • 1970-01-01
    相关资源
    最近更新 更多