|
1 | 1 | import .ForwardDiff
|
2 | 2 |
|
3 | 3 | @generated function SLEEFPirates.tanh_fast(x::ForwardDiff.Dual{T,S,N}) where {T,S,N}
|
4 |
| - quote |
5 |
| - $(Expr(:meta,:inline)) |
6 |
| - t = tanh_fast(x.value) |
7 |
| - ∂t = vfnmadd_fast(t, t, one(S)) |
8 |
| - p = x.partials |
9 |
| - ForwardDiff.Dual(t, ForwardDiff.Partials(Base.Cartesian.@ntuple $N n -> mul_fast(∂t, p[n]))) |
10 |
| - end |
| 4 | + quote |
| 5 | + $(Expr(:meta,:inline)) |
| 6 | + t = tanh_fast(x.value) |
| 7 | + ∂t = vfnmadd_fast(t, t, one(S)) |
| 8 | + p = x.partials |
| 9 | + ForwardDiff.Dual{T}(t, ForwardDiff.Partials(Base.Cartesian.@ntuple $N n -> mul_fast(∂t, p[n]))) |
| 10 | + end |
11 | 11 | end
|
12 | 12 | @generated function SLEEFPirates.sigmoid_fast(x::ForwardDiff.Dual{T,S,N}) where {T,S,N}
|
13 |
| - quote |
14 |
| - $(Expr(:meta,:inline)) |
15 |
| - s = sigmoid_fast(x.value) |
16 |
| - ∂s = vfnmadd_fast(s,s,s) |
17 |
| - p = x.partials |
18 |
| - ForwardDiff.Dual(s, ForwardDiff.Partials(Base.Cartesian.@ntuple $N n -> mul_fast(∂s, p[n]))) |
19 |
| - end |
| 13 | + quote |
| 14 | + $(Expr(:meta,:inline)) |
| 15 | + s = sigmoid_fast(x.value) |
| 16 | + ∂s = vfnmadd_fast(s,s,s) |
| 17 | + p = x.partials |
| 18 | + ForwardDiff.Dual{T}(s, ForwardDiff.Partials(Base.Cartesian.@ntuple $N n -> mul_fast(∂s, p[n]))) |
| 19 | + end |
20 | 20 | end
|
21 | 21 | @generated function VectorizationBase.relu(x::ForwardDiff.Dual{T,S,N}) where {T,S,N}
|
22 |
| - quote |
23 |
| - $(Expr(:meta,:inline)) |
24 |
| - v = x.value |
25 |
| - z = zero(v) |
26 |
| - cmp = v < z |
27 |
| - r = ifelse(cmp, z, v) |
28 |
| - p = x.partials |
29 |
| - ForwardDiff.Dual(r, ForwardDiff.Partials(Base.Cartesian.@ntuple $N n -> ifelse(cmp, z, p[n]))) |
30 |
| - end |
| 22 | + quote |
| 23 | + $(Expr(:meta,:inline)) |
| 24 | + v = x.value |
| 25 | + z = zero(v) |
| 26 | + cmp = v < z |
| 27 | + r = ifelse(cmp, z, v) |
| 28 | + p = x.partials |
| 29 | + ForwardDiff.Dual{T}(r, ForwardDiff.Partials(Base.Cartesian.@ntuple $N n -> ifelse(cmp, z, p[n]))) |
| 30 | + end |
31 | 31 | end
|
32 | 32 | @generated function init_dual(v::Tuple{Vararg{AbstractSIMD,A}}) where {A}
|
33 |
| - res = Expr(:tuple) |
34 |
| - q = Expr(:block, Expr(:meta,:inline)) |
35 |
| - for a ∈ 1:A |
36 |
| - v_a = Symbol(:v_,a) |
37 |
| - push!(q.args, Expr(:(=), v_a, Expr(:ref, :v, a))) |
38 |
| - partials = Expr(:tuple) |
39 |
| - for i ∈ 1:A |
40 |
| - push!(partials.args, Expr(:call, i == a ? :one : :zero, v_a)) |
41 |
| - end |
42 |
| - push!(res.args, :(ForwardDiff.Dual($v_a, ForwardDiff.Partials($partials)))) |
| 33 | + res = Expr(:tuple) |
| 34 | + q = Expr(:block, Expr(:meta,:inline)) |
| 35 | + for a ∈ 1:A |
| 36 | + v_a = Symbol(:v_,a) |
| 37 | + push!(q.args, Expr(:(=), v_a, Expr(:ref, :v, a))) |
| 38 | + partials = Expr(:tuple) |
| 39 | + for i ∈ 1:A |
| 40 | + push!(partials.args, Expr(:call, i == a ? :one : :zero, v_a)) |
43 | 41 | end
|
44 |
| - push!(q.args, res) |
45 |
| - q |
| 42 | + push!(res.args, :(ForwardDiff.Dual($v_a, ForwardDiff.Partials($partials)))) |
| 43 | + end |
| 44 | + push!(q.args, res) |
| 45 | + q |
46 | 46 | end
|
47 | 47 | @generated function dual_store!(∂p::Tuple{Vararg{AbstractStridedPointer,A}}, p::AbstractStridedPointer, ∂v, im::Vararg{Any,N}) where {A,N}
|
48 |
| - quote |
49 |
| - $(Expr(:meta,:inline)) |
50 |
| - v = ∂v.value |
51 |
| - ∂ = ∂v.partials |
52 |
| - Base.Cartesian.@nextract $N im im |
53 |
| - Base.Cartesian.@ncall $N VectorizationBase.vnoaliasstore! p v im # store |
54 |
| - Base.Cartesian.@nexprs $A a -> begin # for each of `A` partials |
55 |
| - ∂p_a = ∂p[a] |
56 |
| - ∂_a = ∂[a] |
57 |
| - Base.Cartesian.@ncall $N VectorizationBase.vnoaliasstore! ∂p_a ∂_a im # store |
58 |
| - end |
59 |
| - nothing |
| 48 | + quote |
| 49 | + $(Expr(:meta,:inline)) |
| 50 | + v = ∂v.value |
| 51 | + ∂ = ∂v.partials |
| 52 | + Base.Cartesian.@nextract $N im im |
| 53 | + Base.Cartesian.@ncall $N VectorizationBase.vnoaliasstore! p v im # store |
| 54 | + Base.Cartesian.@nexprs $A a -> begin # for each of `A` partials |
| 55 | + ∂p_a = ∂p[a] |
| 56 | + ∂_a = ∂[a] |
| 57 | + Base.Cartesian.@ncall $N VectorizationBase.vnoaliasstore! ∂p_a ∂_a im # store |
60 | 58 | end
|
| 59 | + nothing |
| 60 | + end |
61 | 61 | end
|
62 | 62 |
|
63 | 63 |
|
0 commit comments