From 7898e029c95135b357b5d75fa1312e38f28f7dbd Mon Sep 17 00:00:00 2001 From: Kristoffer Carlsson Date: Thu, 20 Sep 2018 17:34:04 -0400 Subject: [PATCH 1/2] remove inference stuff also do linalg dont force unroll loop in reductions --- src/linalg.jl | 70 ++++++++++++++++++++++------------------------- src/mapreduce.jl | 43 ++++++++++++++--------------- test/mapreduce.jl | 4 +-- 3 files changed, 56 insertions(+), 61 deletions(-) diff --git a/src/linalg.jl b/src/linalg.jl index f0b4b5d8..729e27bc 100644 --- a/src/linalg.jl +++ b/src/linalg.jl @@ -228,14 +228,13 @@ end return :(zero(promote_op(*, eltype(a), eltype(b)))) end - expr = :(conj(a[1]) * b[1]) - for j = 2:prod(S) - expr = :($expr + conj(a[$j]) * b[$j]) - end - return quote @_inline_meta - @inbounds return $expr + s = conj(a[1]) * b[1] + @inbounds @simd for j = 2:$(prod(S)) + s += conj(a[j]) * b[j] + end + return s end end @@ -244,15 +243,13 @@ end if prod(S) == 0 return :(zero(promote_op(*, eltype(a), eltype(b)))) end - - expr = :(a[1] * b[1]) - for j = 2:prod(S) - expr = :($expr + a[$j] * b[$j]) - end - return quote @_inline_meta - @inbounds return $expr + s = a[1] * b[1] + @inbounds @simd for j = 2:$(prod(S)) + s += a[j] * b[j] + end + return s end end @@ -264,14 +261,13 @@ end return :(zero(real(eltype(a)))) end - expr = :(abs2(a[1])) - for j = 2:prod(S) - expr = :($expr + abs2(a[$j])) - end - return quote - $(Expr(:meta, :inline)) - @inbounds return sqrt($expr) + @_inline_meta + s = abs2(a[1]) + @inbounds @simd for j = 2:$(prod(S)) + s += abs2(a[j]) + end + return sqrt(s) end end @@ -283,28 +279,27 @@ _norm_p0(x) = x == 0 ? zero(x) : one(x) return :(zero(real(eltype(a)))) end - expr = :(abs(a[1])^p) - for j = 2:prod(S) - expr = :($expr + abs(a[$j])^p) - end - - expr_p1 = :(abs(a[1])) - for j = 2:prod(S) - expr_p1 = :($expr_p1 + abs(a[$j])) - end - return quote - $(Expr(:meta, :inline)) + @_inline_meta + s = zero(real(eltype(a))) if p == Inf return mapreduce(abs, max, a; init=$(zero(real(eltype(a))))) elseif p == 1 - @inbounds return $expr_p1 + s = abs(a[1]) + @inbounds @simd for j = 2:$(prod(S)) + s += abs(a[j]) + end + return s elseif p == 2 return norm(a) elseif p == 0 return mapreduce(_norm_p0, +, a; init=$(zero(real(eltype(a))))) else - @inbounds return ($expr)^(inv(p)) + s = abs(a[1])^p + @inbounds @simd for j = 2:$(prod(S)) + s += abs(a[j])^p + end + return s^(inv(p)) end end end @@ -325,12 +320,13 @@ end return :(zero(eltype(a))) end - exprs = [:(a[$(LinearIndices(S)[i, i])]) for i = 1:S[1]] - total = reduce((ex1, ex2) -> :($ex1 + $ex2), exprs) - return quote @_inline_meta - @inbounds return $total + s = a[1,1] + @inbounds @simd for 2 in 1:$(S[1]) + s += a[i,i] + end + return s end end diff --git a/src/mapreduce.jl b/src/mapreduce.jl index becbc3d9..92480885 100644 --- a/src/mapreduce.jl +++ b/src/mapreduce.jl @@ -45,14 +45,13 @@ end @generated function _map!(f, dest, ::Size{S}, a::StaticArray...) where {S} - exprs = Vector{Expr}(undef, prod(S)) - for i ∈ 1:prod(S) - tmp = [:(a[$j][$i]) for j ∈ 1:length(a)] - exprs[i] = :(dest[$i] = f($(tmp...))) - end + tmp = [:(a[$j][i]) for j ∈ 1:length(a)] return quote @_inline_meta - @inbounds $(Expr(:block, exprs...)) + @inbounds @simd for i ∈ 1:$(prod(S)) + dest[i] = f($(tmp...)) + end + return dest end end @@ -66,28 +65,28 @@ end @generated function _mapreduce(f, op, dims::Colon, nt::NamedTuple{()}, ::Size{S}, a::StaticArray...) where {S} - tmp = [:(a[$j][1]) for j ∈ 1:length(a)] - expr = :(f($(tmp...))) - for i ∈ 2:prod(S) - tmp = [:(a[$j][$i]) for j ∈ 1:length(a)] - expr = :(op($expr, f($(tmp...)))) - end + tmp = [:(a[$j][i]) for j ∈ 1:length(a)] return quote @_inline_meta - @inbounds return $expr + i = 1 + @inbounds s = f($(tmp...)) + @inbounds @simd for i = 2:$(prod(S)) + s = op(s, f($(tmp...))) + end + return s end end - + @generated function _mapreduce(f, op, dims::Colon, nt::NamedTuple{(:init,)}, - ::Size{S}, a::StaticArray...) where {S} - expr = :(nt.init) - for i ∈ 1:prod(S) - tmp = [:(a[$j][$i]) for j ∈ 1:length(a)] - expr = :(op($expr, f($(tmp...)))) - end + ::Size{S}, a::StaticArray...) where {S} + tmp = [:(a[$j][i]) for j ∈ 1:length(a)] return quote @_inline_meta - @inbounds return $expr + s = nt.init + @inbounds @simd for i = 1:$(prod(S)) + s = op(s, f($(tmp...))) + end + return s end end @@ -98,7 +97,7 @@ end @inline _mapreduce(f, op, D::Int, nt::NamedTuple, sz::Size{S}, a::StaticArray) where {S} = _mapreduce(f, op, Val(D), nt, sz, a) - + @generated function _mapreduce(f, op, dims::Val{D}, nt::NamedTuple{()}, ::Size{S}, a::StaticArray) where {S,D} N = length(S) diff --git a/test/mapreduce.jl b/test/mapreduce.jl index f52bb5f7..be4af507 100644 --- a/test/mapreduce.jl +++ b/test/mapreduce.jl @@ -58,7 +58,7 @@ end @test iszero(sz) == iszero(z) - @test sum(sa) === sum(a) + @test sum(sa) ≈ sum(a) @test sum(abs2, sa) === sum(abs2, a) @test sum(sa, dims=2) === RSArray2(sum(a, dims=2)) @test sum(sa, dims=Val(2)) === RSArray2(sum(a, dims=2)) @@ -85,7 +85,7 @@ end @test any(sb, dims=Val(2)) === RSArray2(any(b, dims=2)) @test any(x->x>0, sa, dims=Val(2)) === RSArray2(any(x->x>0, a, dims=2)) - @test mean(sa) === mean(a) + @test mean(sa) ≈ mean(a) @test mean(abs2, sa) === mean(abs2, a) @test mean(sa, dims=Val(2)) === RSArray2(mean(a, dims=2)) @test mean(abs2, sa, dims=Val(2)) === RSArray2(mean(abs2.(a), dims=2)) From e283ff5dee26cefd183ec4c175224495b308e6e7 Mon Sep 17 00:00:00 2001 From: Kristoffer Carlsson Date: Fri, 21 Sep 2018 11:34:23 -0400 Subject: [PATCH 2/2] remove looping in map! --- src/mapreduce.jl | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/mapreduce.jl b/src/mapreduce.jl index 92480885..354cee1e 100644 --- a/src/mapreduce.jl +++ b/src/mapreduce.jl @@ -43,15 +43,15 @@ end _map!(f, dest, same_size(dest, a, b), a, b) end - @generated function _map!(f, dest, ::Size{S}, a::StaticArray...) where {S} - tmp = [:(a[$j][i]) for j ∈ 1:length(a)] + exprs = Vector{Expr}(undef, prod(S)) + for i ∈ 1:prod(S) + tmp = [:(a[$j][$i]) for j ∈ 1:length(a)] + exprs[i] = :(dest[$i] = f($(tmp...))) + end return quote @_inline_meta - @inbounds @simd for i ∈ 1:$(prod(S)) - dest[i] = f($(tmp...)) - end - return dest + @inbounds $(Expr(:block, exprs...)) end end