Napisałem funkcję mnożenia w Galois fields w c++, ale jest ona wolna, zwłaszcza w porównaniu do normalnego mnożenia:
uint32_t p = 4194311;
uint32_t add( uint32_t a, uint32_t b )
{
return a ^ b;
}
uint32_t multiply( uint32_t a, uint32_t b )
{
uint64_t c = 0;
for( unsigned int i = 0; i < 32; ++i )
{
c ^= a & ( 1 << i ) ? (uint64_t) b << i : 0;
}
for( unsigned int i = 32; i --> 0 ; )
{
if( c & ( 1 << ( i + 32 ) ) )
{
c ^= 1 << ( i + 32 );
c ^= (uint64_t) p << i;
}
}
return (uint32_t) c;
}
Co więcej chciałbym na przykład mnożyć w GF liczby 64-bitowe albo 128-bitowe, a tego nie da się zrobić w mojej funkcji bez intów 128-bitowych i 256-bitowych. Zaś CLMUL chyba pozwala mnożyć nawet tak duże liczby w GF.
Czy wiecie jak użyć tych instrukcji w praktyce?