gpt4 book ai didi

assembly - 是否可以使用 SSE 和 SSE2 来生成 128 位宽的整数?

转载 作者:行者123 更新时间:2023-12-02 10:40:07 25 4
gpt4 key购买 nike

我想更多地了解 SSE2 的功能,并想知道是否可以制作一个支持加法、减法、异或和乘法的 128 位宽整数?

最佳答案

SIMD 旨在同时处理多个小值,因此不会有任何结转到更高单元,您必须手动执行此操作。在 SSE2 中没有进位标志,但您可以轻松地将进位计算为 carry = sum < acarry = sum < b喜欢 this .更糟糕的是,SSE2 也没有 64 位比较,因此您必须使用一些解决方法,例如 here
这是基于上述想法的未经测试、未经优化的 C 代码:

inline bool lessthan(__m128i a, __m128i b){
a = _mm_xor_si128(a, _mm_set1_epi32(0x80000000));
b = _mm_xor_si128(b, _mm_set1_epi32(0x80000000));
__m128i t = _mm_cmplt_epi32(a, b);
__m128i u = _mm_cmpgt_epi32(a, b);
__m128i z = _mm_or_si128(t, _mm_shuffle_epi32(t, 177));
z = _mm_andnot_si128(_mm_shuffle_epi32(u, 245),z);
return _mm_cvtsi128_si32(z) & 1;
}

inline __m128i addi128(__m128i a, __m128i b)
{
__m128i sum = _mm_add_epi64(a, b);
__m128i mask = _mm_set1_epi64(0x8000000000000000);
if (lessthan(_mm_xor_si128(mask, sum), _mm_xor_si128(mask, a)))
{
__m128i ONE = _mm_setr_epi64(0, 1);
sum = _mm_add_epi64(sum, ONE);
}

return sum;
}
如您所见,代码需要更多指令,即使优化后它可能仍然比 x86_64 中的简单 2 ADD/ADC 对(或 x86 中的 4 条指令)长得多

如果您有 ,SSE2 会有所帮助。要并行添加的多个 128 位整数 .但是,您需要正确排列值的高低部分,以便我们可以一次添加所有低部分,并一次添加所有高部分
也可以看看
  • practical BigNum AVX/SSE possible?
  • Can long integer routines benefit from SSE?
  • 关于assembly - 是否可以使用 SSE 和 SSE2 来生成 128 位宽的整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12200698/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com