Size: a a a

Язык программирования Julia / Julia programming language

2021 March 26

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
f1(n) = n ÷ 2 ÷ 64
f2(n) = n >> 7


julia> @code_llvm f1(Ref(1000)[])
;  @ REPL[2]:1 within `f1'
define i64 @julia_f1_682(i64 signext %0) {
top:
; ┌ @ int.jl:263 within `div'
  %1 = sdiv i64 %0, 128
; └
 ret i64 %1
}

julia> @code_llvm f2(Ref(1000)[])
;  @ REPL[3]:1 within `f2'
define i64 @julia_f2_686(i64 signext %0) {
top:
; ┌ @ int.jl:464 within `>>' @ int.jl:457
  %1 = ashr i64 %0, 7
; └
 ret i64 %1
}
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
То есть он правда догадался, что константы надо схлопнуть, но на уровне llvm две разные операции вызываются.
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
Может быть конечно sdiv внутри догадается сделать ashr, но для этого ему как минимум надо дополнительную проверку сделать.
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
Что в в побитовой форме число имеет ровно одну 1.
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
Если он это делает на этапе компиляции, то это всего лишь чуть-чуть замедляет процесс, что не страшно.
Если он это делает в рантайме, то он тормозит вычисления (то есть появляется ненужный оверхед).
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
В общем, дело того, кто пишет библиотеку 😊
Моя практика показывает, что если есть возможность использовать битовые операции (то есть происходит деление или умножение на два), то лучше пользоваться операциями битового сдвига, это всегда даёт прирост в производительности.
источник

AP

Alexander Plavin in Язык программирования Julia / Julia programming language
в общем я тоже проверил раз уж такое дело :)
julia> xs = rand(Int, 1000);
julia> f(x) = x ÷ 128
julia> g(x) = x >> 7
julia> @btime g.($xs);
 451.109 ns (1 allocation: 7.94 KiB)
julia> @btime f.($xs);
 466.754 ns (1 allocation: 7.94 KiB)
источник

AP

Alexander Plavin in Язык программирования Julia / Julia programming language
т.е. различия меньше ошибок
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
Как я сказал, up to author
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
У каждого свои бест практисес.
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
Немного надуманный пример, но тем не менее

f1(n, x::Int64) = n ÷ x
f2(n, x::Int64) = n >> (63 - leading_zeros(x))

v = rand(StableRNG(2021), 1:10000000, 1000);
d = rand(StableRNG(2022), [64, 128], 1000);

julia> @btime f1.(v, d);
 4.092 μs (3 allocations: 8.00 KiB)

julia> @btime f2.(v, d);
 1.490 μs (3 allocations: 8.00 KiB)
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
Уже не в пределах ошибки.
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
В таких микробенчмарках компилятор и правда хорошо константы протаскивает, но кто может поручиться, что так же будет и в большом коде, где много чего определяется в рантайме?
источник

AP

Alexander Plavin in Язык программирования Julia / Julia programming language
конечно, я про константы
источник

AP

Alexander Plavin in Язык программирования Julia / Julia programming language
просто приходится иногда читать код, где для "оптимизации" вот так позаменяли деления/умножения
становится сложнее читать и понимать, на что они всё-таки делят :) особенно если рядом есть комментарий типа # divide by 128, но он устарел и уже не соответствует коду
обычно именно с константами происходит дело
источник

AP

Alexander Plavin in Язык программирования Julia / Julia programming language
совсем весело, когда так делают в питоновском цикле для вычислений над отдельными int'ами
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
Ну, в питоне да 😊)))
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
Не, тут надо с умом конечно, в tight loop только такие штуки делать.
Но в tight всё-таки надо максимальной оптимизации добиваться.
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
julia> f1.(v, d) == f2.(v, d)
true
источник

AP

Alexander Plavin in Язык программирования Julia / Julia programming language
кстати, если есть кто и в слак и в зулип джулии заходит - имеется там какая-то разница по обсуждениям и вопросам?
я только в слак писал пока, но как-то печально что он сообщения удаляет
источник