Моя задача - проверить (> триллионов проверок), содержат ли два int какую-либо из предопределенных пар полубайтов (первая пара 0x2 0x7; вторая 0xd 0x8). Например:
bit offset: 12345678
first int: 0x3d542783 first pair of 0x2 second: 0xd
second int: 0x486378d9 nibbles: 0x7 pair: 0x8
^ ^
Итак, в этом примере я помечаю два смещения необходимыми парами (смещения 2 и 5, но не 7). Фактические смещения и количество найденных пар не нужны в моей задаче.
Итак, для данных двух int возникает вопрос: Содержат ли они любую из этих пар полубайтов с одинаковым смещением.
Я проверил моя программа, эта часть самое горячее место ( gprof
проверено); и это называется очень-очень много раз ( gcov
доказано). На самом деле это 3-й или 4-й цикл (наиболее вложенный) вложенных циклов.
Мой текущий код медленный (я переписываю его как функцию, но это код из внутреннего цикла):
static inline int nibble_check (uint32_t A, uint32_t B)
__attribute__((always_inline))
{
int i;
for(i=0;i<8;i++)
if( ( ( (A&0xf) ==0xD) && ( (B&0xf) ==0x8) ) // first pair
|| ( ( (A&0xf) ==0x2) && ( (B&0xf) ==0x7) ) ) // second pair
return 1; // nibbles found
else {
A>>=4;
B>>=4;
}
return 0; // nibbles not found
}
Другая задача - найти эти пары не только по смещениям 0,4,8 бит и так далее, но и по смещениям 0,2,4,8,10, ... бит:
#define douburu_nibble_check(A,B) (nibble_check(A,B) || nibble_check(A>>2, B>>2) )
Можно ли переписать эта функция и макрос параллельно?
Мой компилятор - gcc452, а процессор - Intel Core2 Solo в 32-битном режиме (x86).