|
141 | 141 | @inline _mul_partials(a::Partials{0,A}, b::Partials{N,B}, afactor, bfactor) where {N,A,B} = bfactor * b |
142 | 142 | @inline _mul_partials(a::Partials{N,A}, b::Partials{0,B}, afactor, bfactor) where {N,A,B} = afactor * a |
143 | 143 |
|
| 144 | +const SIMDFloat = Union{Float64, Float32} |
| 145 | +const SIMDInt = Union{ |
| 146 | + Int128, Int64, Int32, Int16, Int8, |
| 147 | + UInt128, UInt64, UInt32, UInt16, UInt8, |
| 148 | + } |
| 149 | +const SIMDType = Union{SIMDFloat, SIMDInt} |
| 150 | + |
144 | 151 | ################################## |
145 | 152 | # Generated Functions on NTuples # |
146 | 153 | ################################## |
|
164 | 171 | @inline rand_tuple(::AbstractRNG, ::Type{Tuple{}}) = tuple() |
165 | 172 | @inline rand_tuple(::Type{Tuple{}}) = tuple() |
166 | 173 |
|
| 174 | +iszero_tuple(tup::NTuple{N,V}) where {N, V<:SIMDType} = sum(Vec(tup) != zero(V)) == 0 |
167 | 175 | @generated function iszero_tuple(tup::NTuple{N,V}) where {N,V} |
168 | 176 | ex = Expr(:&&, [:(z == tup[$i]) for i=1:N]...) |
169 | 177 | return quote |
@@ -197,29 +205,24 @@ end |
197 | 205 | return tupexpr(i -> :(rand(V)), N) |
198 | 206 | end |
199 | 207 |
|
200 | | -@generated function scale_tuple(tup::NTuple{N}, x) where N |
201 | | - return tupexpr(i -> :(tup[$i] * x), N) |
202 | | -end |
| 208 | +const NT{N,T} = NTuple{N,T} |
203 | 209 |
|
204 | | -@generated function div_tuple_by_scalar(tup::NTuple{N}, x) where N |
205 | | - return tupexpr(i -> :(tup[$i] / x), N) |
206 | | -end |
| 210 | +# SIMD implementation |
| 211 | +@inline add_tuples(a::NT{N,T}, b::NT{N,T}) where {N, T<:SIMDType} = Tuple(Vec(a) + Vec(b)) |
| 212 | +@inline sub_tuples(a::NT{N,T}, b::NT{N,T}) where {N, T<:SIMDType} = Tuple(Vec(a) - Vec(b)) |
| 213 | +@inline scale_tuple(tup::NT{N,T}, x::T) where {N, T<:SIMDType} = Tuple(Vec(tup) * x) |
| 214 | +@inline div_tuple_by_scalar(tup::NT{N,T}, x::T) where {N, T<:SIMDFloat} = Tuple(Vec(tup) / x) |
| 215 | +@inline minus_tuple(tup::NT{N,T}) where {N, T<:SIMDType} = Tuple(-Vec(tup)) |
| 216 | +@inline mul_tuples(a::NT{N,T}, b::NT{N,T}, af::T, bf::T) where {N, T<:SIMDType} = Tuple(muladd(af, Vec(a), bf * Vec(b))) |
207 | 217 |
|
208 | | -@generated function add_tuples(a::NTuple{N}, b::NTuple{N}) where N |
209 | | - return tupexpr(i -> :(a[$i] + b[$i]), N) |
210 | | -end |
211 | 218 |
|
212 | | -@generated function sub_tuples(a::NTuple{N}, b::NTuple{N}) where N |
213 | | - return tupexpr(i -> :(a[$i] - b[$i]), N) |
214 | | -end |
215 | | - |
216 | | -@generated function minus_tuple(tup::NTuple{N}) where N |
217 | | - return tupexpr(i -> :(-tup[$i]), N) |
218 | | -end |
219 | | - |
220 | | -@generated function mul_tuples(a::NTuple{N}, b::NTuple{N}, afactor, bfactor) where N |
221 | | - return tupexpr(i -> :((afactor * a[$i]) + (bfactor * b[$i])), N) |
222 | | -end |
| 219 | +# Fallback implementations |
| 220 | +@generated add_tuples(a::NT{N}, b::NT{N}) where N = tupexpr(i -> :(a[$i] + b[$i]), N) |
| 221 | +@generated sub_tuples(a::NT{N}, b::NT{N}) where N = tupexpr(i -> :(a[$i] - b[$i]), N) |
| 222 | +@generated scale_tuple(tup::NT{N}, x) where N = tupexpr(i -> :(tup[$i] * x), N) |
| 223 | +@generated div_tuple_by_scalar(tup::NT{N}, x) where N = tupexpr(i -> :(tup[$i] / x), N) |
| 224 | +@generated minus_tuple(tup::NT{N}) where N = tupexpr(i -> :(-tup[$i]), N) |
| 225 | +@generated mul_tuples(a::NT{N}, b::NT{N}, af, bf) where N = tupexpr(i -> :(muladd(af, a[$i], bf * b[$i])), N) |
223 | 226 |
|
224 | 227 | ################### |
225 | 228 | # Pretty Printing # |
|
0 commit comments