如果发生某种情况,是否可以在 SIMD 指令中进行比较并交换值。换句话说,我有 4 个整数:
(100 5) (1 42)
Run Code Online (Sandbox Code Playgroud)
我想收到:
(5 100) (1 42)
Run Code Online (Sandbox Code Playgroud)
即我想成对比较(第一个值与第二个值,第三个值与第四个值),如果左操作数更大 - 交换值。是否可以只使用 1 个 SIMD?
PS:这是我第一次尝试 SIMD,可能我使用了错误的术语 - 如果我错了,请纠正我。
对于支持 AVX2 的系统,有一种使用最小/最大和混合的解决方案imm(其具有 1 个周期延迟,而变量一个则有 2 个周期)。
以下代码有 3 个周期延迟,在 HSW+ 上的吞吐量应小于 2 个周期
__m128i tmp = _mm_shuffle_epi32(in, _MM_SHUFFLE(2,3,0,1));
__m128i min = _mm_min_epi32(in, tmp);
__m128i max = _mm_max_epi32(in, tmp);
// __m128i res = _mm_blend_epi32(min, max, 0xA); // AVX2 only
__m128i res = _mm_blend_epi16(min, max, 0xCC); // SSE4.1
Run Code Online (Sandbox Code Playgroud)
我已经在我的 HSW 系统上对其进行了测试(处理 20000 对 100K 次),它的性能比代码好约 26%stgatilov
CMP + VARIABLE BLEND 1.18sec
MIN/MAX + BLEND_32 0.87sec // AVX2 only code
MIN/MAX + BLEND_PS 0.86sec // SSE
MIN/MAX + PLEND_16 0.88sec // Preferred for SSE
Run Code Online (Sandbox Code Playgroud)
更新:根据stgatilov下面的评论。所有 MIN/MAX 实现几乎具有相同的性能(很可能只是卡在黑白内存中)
| 归档时间: |
|
| 查看次数: |
3251 次 |
| 最近记录: |