当前位置: 首页 > 知识库问答 >
问题:

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

归浩博
2023-03-14

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

共有1个答案

扶高歌
2023-03-14

SIMD意味着同时处理多个小值,因此不会有任何转移到更高的单位,你必须手动完成。在SSE2中没有进位标志,但是可以很容易地将进位计算为carrid=sum carrid=sum ,如下所示。更糟糕的是,SSE2也没有64位比较,所以您必须使用类似于这里的一些变通方法

下面是一个基于上述思想的未经测试、未经优化的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个指令)要长得多

    null

 类似资料:
  • 我正在用C#开发一个加密用户和管理员密码的类项目。为了加密,我使用了< code > triplescryptoserviceprovider 。 在配置应用程序中,用户输入用于加密和解密密码的密钥。我想有一个按钮来生成密钥来帮助用户,但我不知道如何随机生成128位。如何生成128位的密钥?

  • 本文向大家介绍Intel指令集中MMX,SSE,SSE2,SSE3和SSE4指的是什么?相关面试题,主要包含被问及Intel指令集中MMX,SSE,SSE2,SSE3和SSE4指的是什么?时的应答技巧和注意事项,需要的朋友参考一下 MMX(Multi Media eXtension,多媒体扩展指令集)是一些整数并行运算指令。 SSE(Streaming SIMD Extensions,单指令多数据

  • 问题内容: 我需要生成一个具有给定范围的连续整数数组,以便在以下环境中使用它: 问题答案: 因为您说您已经有一个数字表,所以我建议这样做: 可能比您尝试过的查询更有效。

  • 检查第一个数字参数是否可被第二个数字整除。 使用模运算符(%)来检查余数是否等于 0 。 const isDivisible = (dividend, divisor) => dividend % divisor === 0; isDivisible(6, 3); // true

  • 我有一个JS项目,它使用aws服务作为后端(Cognito、AppSync、S3等)。 我使用AWS Amplify访问这些服务,但不使用Amplify CLI;所有aws服务都是手动配置的。 关于AppSync,我有一个小脚本,它读取模式(从APPESNC控制台手动下载),然后生成TypeScript操作和操作类型文件(使用放大器-图形ql-文档-生成器和放大器-图形ql-类型-生成器)。 有没

  • 比方说,我有一个班,学生。每个学生对象都有一个唯一的字段(int ID)和其他公共字段(如String schoolName等)。 现在只考虑字段ID生成hashcode()和equals()可以吗?