Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- function bench_mid_two_vals ()
- N = 1e7;
- m1 = int64 (randi (100, 1, N));
- m2 = int64 (randi (100, 1, N));
- samesign = sign (m1) == sign (m2);
- f_branchless = @() ...
- (samesign .* (m1 + (m2 - m1) / 2) + !samesign .* ((m1 + m2) / 2));
- f_masked = @() masked_impl (m1, m2, samesign);
- % warmup
- for i = 1:5
- f_branchless ();
- f_masked ();
- end
- runs = 20;
- t1 = zeros (1, runs);
- t2 = zeros (1, runs);
- for i = 1:runs
- tic; f_branchless (); t1(i) = toc;
- tic; f_masked (); t2(i) = toc;
- end
- printf ("Branchless: %.3f ms\n", mean (t1)*1000);
- printf ("Masked: %.3f ms\n", mean (t2)*1000);
- printf ("Speedup (masked / branchless): %.2fx\n", mean (t2)/mean (t1));
- endfunction
- function m = masked_impl (m1, m2, samesign)
- m = zeros (size (m1), "like", m1);
- m(samesign) = m1(samesign) + (m2(samesign) - m1(samesign)) / 2;
- m(!samesign) = (m1(!samesign) + m2(!samesign)) / 2;
- endfunction
Advertisement
Add Comment
Please, Sign In to add comment