使用MMX比较128位int

gcc提供了__uint128_t和__int128_t两种128位整型数据类型,使用它可以进行大整数的计算,但是在实际应用中发现,做两个128整数的比较是很耗费cpu的事情,在我的一个程序中需要用到对两个128位数判断是否相等,类似如下代码:

__uint128_t a,b;
a = 10;
b = 11;
if(a == b) {
    ......
}else{
    ......
}

结果发现仅仅是其中
if(a == b)

一行,就占用了整个程序10%以上的cpu。


为了降低这部分cpu占用,我想到了可以用mmx指令进行处理,mmx指令的列表可以参考:

http://www.cnblogs.com/zyl910/archive/2012/07/19/intrin01_mmx.html


这里我们会用到:_mm_xor_si128即对两个128位数做异或,从而比较是否相同,代码如下所示:


#include <stdint.h>
#include <mmintrin.h>
#include <xmmintrin.h>
#include <emmintrin.h>
#include <immintrin.h>


union hashCompare{
	__uint128_t hash;
	__m128i mmx;
};



int compareHash(__uint128_t hash1, __uint128_t hash2) {
	union hashCompare hComA, hComB;
	hComA.hash = hash1;
	hComB.hash = hash2;
	
	__m128i a = _mm_setzero_si128();
	a = _mm_xor_si128(hComA.mmx, hComA.mmx);
	const int32_t* q;
	q = (const int32_t*)&a;
	if (0==q[0] && 0==q[1]){
		_mm_empty();
		return 1;
	}
	_mm_empty();
	return 0;
}


其中:

__m128i为SSE操作对应的数据类型

a为异或比较的结构,它是一个数组分别代表低64位和搞64位异或的结果,如果这两部分都为0说明参与比较的这两个数相同,否则不同

_mm_empty函数用来清理寄存器,每次mmx操作结束都要调用


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值