Znalazłem lewę z AGGREGATE Magic dla szybkiego obliczania wartości maksymalnych. Jedyny problem, który dotyczy liczb całkowitych, i jakkolwiek próbowałem pewnych rzeczy, nie mam pojęcia, jak utworzyć wersję dla liczb całkowitych bez znaku.Szybkie max bez branchless dla liczb całkowitych bez znaku
inline int32_t max(int32_t a, int32_t b)
{
return a - ((a-b) & (a-b)>>31);
}
Jakaś radę?
EDIT
nie korzystać z tego, bo jak inni stwierdził produkuje niezdefiniowanej zachowanie. W przypadku dowolnej nowoczesnej architektury kompilator będzie w stanie emitować warunkową instrukcję ruchu bez rozgałęzienia z return (a > b) ? a : b
, która będzie szybsza niż dana funkcja.
Czekaj, jesteś naprawdę pewien, że to szybciej niż 'powrócić a> b ? a: b'? –
Ta funkcja jest praktycznie bezużyteczna. Użyj 'std :: max'. –
Tak, na nowoczesnych procesorach z potokiem, gałęzie są wolne. Zmierzyłem, ta wersja jest tak szybka jak wersja SSE, jeśli nie szybsza. – plasmacel