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操作结束都要调用