15. • T = uint64_tとして
• 1個の要素あたり
• addが3回, lt_uが2回 (ループ変数の処理は除く)
• lt_uは内部的にはcmp + cmov (多分)
多倍長の足し算
T z = x + c;
c = z < c;
z += y;
c += z < y;
x T
y T
c bool
x + y
c
15 / 21
16. • T = uint32_t単位で処理する
• 32bitのx, yに対して64bitにzext (ゼロ拡張)する
• c = (x + y) >> 32;
• 1個の要素あたりaddが2回, シフトが1回, zextが2回
• 演算回数は増えるが条件代入は無くなる
• マイクロベンチマークでは気持ち64bit版が速い? (微妙)
• JITの影響も大きい
• 利点 : 32bit単位だとcが1bitより大きくてもよい
• まとめて足してからcarry操作をすることでステップ数削減
別の方法
v = uint64_t(x) + y + c;
z = T(v);
c = T(v >> 32);
x T
y T
c bool
x + y
c
16 / 21