From 3fe449cd6a92e12e7560756ccda1d39d69ce0d21 Mon Sep 17 00:00:00 2001 From: Steffen Ridderbusch Date: Tue, 27 Aug 2019 19:06:23 -0700 Subject: [PATCH 01/29] MVP workable for Julia 1.2 --- src/VML.jl | 113 +++++++++++++++++++++++++++++------------------------ 1 file changed, 62 insertions(+), 51 deletions(-) diff --git a/src/VML.jl b/src/VML.jl index 9a854d0..b97f6bb 100644 --- a/src/VML.jl +++ b/src/VML.jl @@ -1,12 +1,16 @@ module VML -import Base: .^, ./ +# import Base: .^, ./ +using Libdl # TODO detect CPU architecture const lib = :libmkl_vml_avx -Libdl.dlopen(:libmkl_rt) +# Libdl.dlopen(:libmkl_rt) +Libdl.dlopen(:libmkl_rt, RTLD_LAZY|RTLD_DEEPBIND|RTLD_GLOBAL ) -immutable VMLAccuracy +Libdl.dlopen(:libmkl_core, RTLD_LAZY|RTLD_DEEPBIND|RTLD_GLOBAL ) #only needed on mac? + +struct VMLAccuracy mode::UInt end const VML_LA = VMLAccuracy(0x00000001) @@ -53,58 +57,63 @@ end function def_unary_op(tin, tout, jlname, jlname!, mklname) mklfn = Base.Meta.quot(Symbol("$(vml_prefix(tin))$mklname")) exports = Symbol[] - isa(jlname, Expr) || push!(exports, jlname) - isa(jlname!, Expr) || push!(exports, jlname!) +# isa(jlname, Expr) || push!(exports, jlname) + (@isdefined jlname) || push!(exports, jlname) +# isa(jlname!, Expr) || push!(exports, jlname!) + (@isdefined jlname!) || push!(exports, jlname!) + display(jlname!) @eval begin - $(isempty(exports) ? nothing : Expr(:export, exports...)) - function $(jlname!){N}(out::Array{$tout,N}, A::Array{$tin,N}) + function ($jlname!)(out::Array{$tout,N}, A::Array{$tin,N}) where {N} size(out) == size(A) || throw(DimensionMismatch()) - ccall(($mklfn, lib), Void, (Int, Ptr{$tin}, Ptr{$tout}), length(A), A, out) + ccall(($mklfn, lib), Nothing, (Int, Ptr{$tin}, Ptr{$tout}), length(A), A, out) vml_check_error() - out + return out end $(if tin == tout quote function $(jlname!)(A::Array{$tin}) - ccall(($mklfn, lib), Void, (Int, Ptr{$tin}, Ptr{$tout}), length(A), A, A) + ccall(($mklfn, lib), Nothing, (Int, Ptr{$tin}, Ptr{$tout}), length(A), A, A) vml_check_error() - A + return A end end end) - function $(jlname)(A::Array{$tin}) + function ($jlname)(A::Array{$tin}) out = similar(A, $tout) - ccall(($mklfn, lib), Void, (Int, Ptr{$tin}, Ptr{$tout}), length(A), A, out) + ccall(($mklfn, lib), Nothing, (Int, Ptr{$tin}, Ptr{$tout}), length(A), A, out) vml_check_error() - out + return out end + $(isempty(exports) ? nothing : Expr(:export, exports...)) end end function def_binary_op(tin, tout, jlname, jlname!, mklname, broadcast) mklfn = Base.Meta.quot(Symbol("$(vml_prefix(tin))$mklname")) exports = Symbol[] - isa(jlname, Expr) || push!(exports, jlname) - isa(jlname!, Expr) || push!(exports, jlname!) +# isa(jlname, Expr) || push!(exports, jlname) + (@isdefined jlname) || push!(exports, jlname) +# isa(jlname!, Expr) || push!(exports, jlname!) + (@isdefined jlname!) || push!(exports, jlname!) @eval begin $(isempty(exports) ? nothing : Expr(:export, exports...)) - function $(jlname!){N}(out::Array{$tout,N}, A::Array{$tin,N}, B::Array{$tin,N}) + function ($jlname!)(out::Array{$tout,N}, A::Array{$tin,N}, B::Array{$tin,N}) where {N} size(out) == size(A) == size(B) || $(broadcast ? :(return broadcast!($jlname, out, A, B)) : :(throw(DimensionMismatch()))) - ccall(($mklfn, lib), Void, (Int, Ptr{$tin}, Ptr{$tin}, Ptr{$tout}), length(A), A, B, out) + ccall(($mklfn, lib), Nothing, (Int, Ptr{$tin}, Ptr{$tin}, Ptr{$tout}), length(A), A, B, out) vml_check_error() out end - function $(jlname){N}(A::Array{$tout,N}, B::Array{$tin,N}) + function ($jlname)(A::Array{$tout,N}, B::Array{$tin,N}) where {N} size(A) == size(B) || $(broadcast ? :(return broadcast($jlname, A, B)) : :(throw(DimensionMismatch()))) out = similar(A) - ccall(($mklfn, lib), Void, (Int, Ptr{$tin}, Ptr{$tin}, Ptr{$tout}), length(A), A, B, out) + ccall(($mklfn, lib), Nothing, (Int, Ptr{$tin}, Ptr{$tin}, Ptr{$tout}), length(A), A, B, out) vml_check_error() out end end end -for t in (Float32, Float64, Complex64, Complex128) +for t in (Float32, Float64, ComplexF32, ComplexF64) # Unary, real or complex def_unary_op(t, t, :(Base.acos), :acos!, :Acos) def_unary_op(t, t, :(Base.asin), :asin!, :Asin) @@ -114,9 +123,9 @@ for t in (Float32, Float64, Complex64, Complex128) def_unary_op(t, t, :(Base.exp), :exp!, :Exp) def_unary_op(t, t, :(Base.log), :log!, :Ln) - # Binary, real or complex - def_binary_op(t, t, :(.^), :pow!, :Pow, true) - def_binary_op(t, t, :(./), :divide!, :Div, true) + # # Binary, real or complex + # def_binary_op(t, t, :(.^), :pow!, :Pow, true) + # def_binary_op(t, t, :(./), :divide!, :Div, true) end for t in (Float32, Float64) @@ -130,12 +139,14 @@ for t in (Float32, Float64) def_unary_op(t, t, :(Base.floor), :floor!, :Floor) def_unary_op(t, t, :(Base.round), :round!, :Round) def_unary_op(t, t, :(Base.trunc), :trunc!, :Trunc) - def_unary_op(t, t, :(Base.erf), :erf!, :Erf) - def_unary_op(t, t, :(Base.erfc), :erfc!, :Erfc) - def_unary_op(t, t, :(Base.erfinv), :erfinv!, :ErfInv) - def_unary_op(t, t, :(Base.erfcinv), :erfcinv!, :ErfcInv) - def_unary_op(t, t, :(Base.lgamma), :lgamma!, :LGamma) - def_unary_op(t, t, :(Base.gamma), :gamma!, :TGamma) + + # now in SpecialFunctions (make smart, maybe?) + # def_unary_op(t, t, :(Base.erf), :erf!, :Erf) + # def_unary_op(t, t, :(Base.erfc), :erfc!, :Erfc) + # def_unary_op(t, t, :(Base.erfinv), :erfinv!, :ErfInv) + # def_unary_op(t, t, :(Base.erfcinv), :erfcinv!, :ErfcInv) + # def_unary_op(t, t, :(Base.lgamma), :lgamma!, :LGamma) + # def_unary_op(t, t, :(Base.gamma), :gamma!, :TGamma) # Not in Base def_unary_op(t, t, :inv_cbrt, :inv_cbrt!, :InvCbrt) def_unary_op(t, t, :inv_sqrt, :inv_sqrt!, :InvSqrt) @@ -154,27 +165,27 @@ for t in (Float32, Float64) def_unary_op(t, t, :(Base.tanh), :tanh!, :Tanh) def_unary_op(t, t, :(Base.log10), :log10!, :Log10) - # .^ to scalar power - mklfn = Base.Meta.quot(Symbol("$(vml_prefix(t))Powx")) - @eval begin - export pow! - function pow!{N}(out::Array{$t,N}, A::Array{$t,N}, b::$t) - size(out) == size(A) || throw(DimensionMismatch()) - ccall(($mklfn, lib), Void, (Int, Ptr{$t}, $t, Ptr{$t}), length(A), A, b, out) - vml_check_error() - out - end - function (.^){N}(A::Array{$t,N}, b::$t) - out = similar(A) - ccall(($mklfn, lib), Void, (Int, Ptr{$t}, $t, Ptr{$t}), length(A), A, b, out) - vml_check_error() - out - end - end - - # Binary, real-only - def_binary_op(t, t, :(Base.atan2), :atan2!, :Atan2, false) - def_binary_op(t, t, :(Base.hypot), :hypot!, :Hypot, false) + # # .^ to scalar power + # mklfn = Base.Meta.quot(Symbol("$(vml_prefix(t))Powx")) + # @eval begin + # export pow! + # function pow!{N}(out::Array{$t,N}, A::Array{$t,N}, b::$t) + # size(out) == size(A) || throw(DimensionMismatch()) + # ccall(($mklfn, lib), Nothing, (Int, Ptr{$t}, $t, Ptr{$t}), length(A), A, b, out) + # vml_check_error() + # out + # end + # function (.^){N}(A::Array{$t,N}, b::$t) + # out = similar(A) + # ccall(($mklfn, lib), Nothing, (Int, Ptr{$t}, $t, Ptr{$t}), length(A), A, b, out) + # vml_check_error() + # out + # end + # end + + # # Binary, real-only + # def_binary_op(t, t, :(Base.atan2), :atan2!, :Atan2, false) + # def_binary_op(t, t, :(Base.hypot), :hypot!, :Hypot, false) # Unary, complex-only def_unary_op(t, Complex{t}, :(Base.cis), :cis!, :CIS) From e7aa9478bc83e140dd4fd4e31e40ec9b4029d7bf Mon Sep 17 00:00:00 2001 From: Steffen Ridderbusch Date: Wed, 28 Aug 2019 15:06:37 -0700 Subject: [PATCH 02/29] Made import work --- src/VML.jl | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/VML.jl b/src/VML.jl index b97f6bb..0335328 100644 --- a/src/VML.jl +++ b/src/VML.jl @@ -4,11 +4,16 @@ module VML using Libdl # TODO detect CPU architecture -const lib = :libmkl_vml_avx +const lib = :libmkl_vml_avx2 # Libdl.dlopen(:libmkl_rt) -Libdl.dlopen(:libmkl_rt, RTLD_LAZY|RTLD_DEEPBIND|RTLD_GLOBAL ) -Libdl.dlopen(:libmkl_core, RTLD_LAZY|RTLD_DEEPBIND|RTLD_GLOBAL ) #only needed on mac? +function __init__() + Libdl.dlopen(:libmkl_rt, RTLD_LAZY|RTLD_DEEPBIND|RTLD_GLOBAL ) + Libdl.dlopen(:libmkl_core, RTLD_LAZY|RTLD_DEEPBIND|RTLD_GLOBAL ) #only needed on mac? + Libdl.dlopen(lib) +end + +__init__() struct VMLAccuracy mode::UInt @@ -61,7 +66,6 @@ function def_unary_op(tin, tout, jlname, jlname!, mklname) (@isdefined jlname) || push!(exports, jlname) # isa(jlname!, Expr) || push!(exports, jlname!) (@isdefined jlname!) || push!(exports, jlname!) - display(jlname!) @eval begin function ($jlname!)(out::Array{$tout,N}, A::Array{$tin,N}) where {N} size(out) == size(A) || throw(DimensionMismatch()) @@ -204,4 +208,5 @@ for t in (Float32, Float64) end export VML_LA, VML_HA, VML_EP, vml_set_accuracy, vml_get_accuracy + end From 07c9f929e084b4fb7d2a6d636a7c631945c1d907 Mon Sep 17 00:00:00 2001 From: Steffen Date: Tue, 3 Sep 2019 18:14:32 +0200 Subject: [PATCH 03/29] Refactor and automatic library detection --- Project.toml | 10 ++++ REQUIRE | 1 - deps/.gitignore | 2 + deps/build.jl | 81 +++++++++++++++++++++++++++ src/VML.jl | 140 ++++++----------------------------------------- src/libdetect.jl | 46 ++++++++++++++++ src/setup.jl | 109 ++++++++++++++++++++++++++++++++++++ 7 files changed, 265 insertions(+), 124 deletions(-) create mode 100644 Project.toml delete mode 100644 REQUIRE create mode 100644 deps/.gitignore create mode 100644 deps/build.jl create mode 100644 src/libdetect.jl create mode 100644 src/setup.jl diff --git a/Project.toml b/Project.toml new file mode 100644 index 0000000..f8b53ce --- /dev/null +++ b/Project.toml @@ -0,0 +1,10 @@ +name = "VML" +uuid = "c8ce9da6-5d36-5c03-b118-5a70151be7bc" + +[deps] +CpuId = "adafc99b-e345-5852-983c-f28acb93d879" +Libdl = "8f399da3-3557-5675-b5ff-fb832c97cbdb" +SpecialFunctions = "276daf66-3868-5448-9aa4-cd146d93841b" + +[compat] +julia = "≥ 0.7.0" diff --git a/REQUIRE b/REQUIRE deleted file mode 100644 index d5d6467..0000000 --- a/REQUIRE +++ /dev/null @@ -1 +0,0 @@ -julia 0.4 diff --git a/deps/.gitignore b/deps/.gitignore new file mode 100644 index 0000000..9243a81 --- /dev/null +++ b/deps/.gitignore @@ -0,0 +1,2 @@ +deps.jl +build.log \ No newline at end of file diff --git a/deps/build.jl b/deps/build.jl new file mode 100644 index 0000000..24e9d17 --- /dev/null +++ b/deps/build.jl @@ -0,0 +1,81 @@ + +using CpuId +using Libdl + + +function defMKLpath() + if Sys.isunix() + return "/opt/intel/mkl/lib" + # elseif Sys.iswindows() + # return + else + return "" + end +end + + + +### First Option, check for user preference +if haskey(ENV, "MKL_SL") + basepath = ENV["MKL_SL"] + if !any([occursin("libmkl_rt",x) for x in readdir(basepath)]) + error(""" ENV["MKL_SL"] is set, but does not point to folder containing MKL files """) + end + println("""Found MKL via ENV["MKL_SL"] + basepath set to $basepath""") + +### Next, check if MKL.jl is already installed. +# Don't want to add to deps, so bit hacky +else + foundMKLjl = [isdir(joinpath(testdir, "packages/MKL")) for testdir in DEPOT_PATH] + + if any(foundMKLjl) + pkgPath = joinpath(DEPOT_PATH[findfirst(foundMKLjl)], "packages/MKL/") + + shortID = readdir(pkgPath)[1] + + basepath = joinpath(pkgPath, shortID, "deps/usr/lib") + + if isdir(basepath) + println("Found MKL.jl package + basepath set to $basepath") + else + error("Found MKL package folder, but MKL libraries at deps/usr/lib are missing + Please rebuild MKL") + end + + elseif isdir(defMKLpath()) + basepath = defMKLpath() + + else + error("Could not find VML shared libraries + Check github.com/.... for details on obtaining them") + + end +end + + +if cpufeature(:AVX2) + lib = joinpath(basepath, "libmkl_vml_avx2") + println("AVX2 support detected, vml_avx2 selected") +else + lib = joinpath(basepath, "libmkl_vml_avx") + println("AVX2 support missing, vml_avx selected") +end + +rtlib = joinpath(basepath, "libmkl_rt") +corelib = joinpath(basepath, "libmkl_core") + + +depsjl_path = joinpath(@__DIR__, "deps.jl") +open(depsjl_path, "w") do depsjl_file + println(depsjl_file, strip(""" + ## This file was autogenerated by build.jl. + ## Do not edit. + import Libdl + + const lib = "$lib" + const rtlib = "$rtlib" + const corelib = "$corelib" + """)) +end \ No newline at end of file diff --git a/src/VML.jl b/src/VML.jl index 0335328..cca9e42 100644 --- a/src/VML.jl +++ b/src/VML.jl @@ -1,121 +1,15 @@ +__precompile__() + module VML # import Base: .^, ./ +using SpecialFunctions using Libdl - # TODO detect CPU architecture -const lib = :libmkl_vml_avx2 -# Libdl.dlopen(:libmkl_rt) - -function __init__() - Libdl.dlopen(:libmkl_rt, RTLD_LAZY|RTLD_DEEPBIND|RTLD_GLOBAL ) - Libdl.dlopen(:libmkl_core, RTLD_LAZY|RTLD_DEEPBIND|RTLD_GLOBAL ) #only needed on mac? - Libdl.dlopen(lib) -end - -__init__() - -struct VMLAccuracy - mode::UInt -end -const VML_LA = VMLAccuracy(0x00000001) -const VML_HA = VMLAccuracy(0x00000002) -const VML_EP = VMLAccuracy(0x00000003) -Base.show(io::IO, m::VMLAccuracy) = print(io, m == VML_LA ? "VML_LA" : - m == VML_HA ? "VML_HA" : "VML_EP") -vml_get_mode() = ccall((:_vmlGetMode, lib), Cuint, ()) -vml_set_mode(mode::Integer) = (ccall((:_vmlSetMode, lib), Cuint, (UInt,), mode); nothing) - -vml_set_accuracy(m::VMLAccuracy) = vml_set_mode((vml_get_mode() & ~0x03) | m.mode) -vml_get_accuracy() = VMLAccuracy(vml_get_mode() & 0x3) +# include("libdetect.jl") +include(joinpath(dirname(@__DIR__), "deps/deps.jl")) -vml_set_mode((vml_get_mode() & ~0x0000FF00)) -function vml_check_error() - vml_error = ccall((:_vmlClearErrStatus, lib), Cint, ()) - if vml_error != 0 - if vml_error == 1 - throw(DomainError()) - elseif vml_error == 2 || vml_error == 3 || vml_error == 4 - # Singularity, overflow, or underflow - # I don't think Base throws on these - elseif vml_error == 1000 - warn("VML does not support $(vml_get_accuracy); lower accuracy used instead") - else - error("an unexpected error occurred in VML ($vml_error)") - end - end -end - -function vml_prefix(t::DataType) - if t == Float32 - return "_vmls" - elseif t == Float64 - return "_vmld" - elseif t == Complex{Float32} - return "_vmlc" - elseif t == Complex{Float64} - return "_vmlz" - end - error("unknown type $t") -end - -function def_unary_op(tin, tout, jlname, jlname!, mklname) - mklfn = Base.Meta.quot(Symbol("$(vml_prefix(tin))$mklname")) - exports = Symbol[] -# isa(jlname, Expr) || push!(exports, jlname) - (@isdefined jlname) || push!(exports, jlname) -# isa(jlname!, Expr) || push!(exports, jlname!) - (@isdefined jlname!) || push!(exports, jlname!) - @eval begin - function ($jlname!)(out::Array{$tout,N}, A::Array{$tin,N}) where {N} - size(out) == size(A) || throw(DimensionMismatch()) - ccall(($mklfn, lib), Nothing, (Int, Ptr{$tin}, Ptr{$tout}), length(A), A, out) - vml_check_error() - return out - end - $(if tin == tout - quote - function $(jlname!)(A::Array{$tin}) - ccall(($mklfn, lib), Nothing, (Int, Ptr{$tin}, Ptr{$tout}), length(A), A, A) - vml_check_error() - return A - end - end - end) - function ($jlname)(A::Array{$tin}) - out = similar(A, $tout) - ccall(($mklfn, lib), Nothing, (Int, Ptr{$tin}, Ptr{$tout}), length(A), A, out) - vml_check_error() - return out - end - $(isempty(exports) ? nothing : Expr(:export, exports...)) - end -end - -function def_binary_op(tin, tout, jlname, jlname!, mklname, broadcast) - mklfn = Base.Meta.quot(Symbol("$(vml_prefix(tin))$mklname")) - exports = Symbol[] -# isa(jlname, Expr) || push!(exports, jlname) - (@isdefined jlname) || push!(exports, jlname) -# isa(jlname!, Expr) || push!(exports, jlname!) - (@isdefined jlname!) || push!(exports, jlname!) - @eval begin - $(isempty(exports) ? nothing : Expr(:export, exports...)) - function ($jlname!)(out::Array{$tout,N}, A::Array{$tin,N}, B::Array{$tin,N}) where {N} - size(out) == size(A) == size(B) || $(broadcast ? :(return broadcast!($jlname, out, A, B)) : :(throw(DimensionMismatch()))) - ccall(($mklfn, lib), Nothing, (Int, Ptr{$tin}, Ptr{$tin}, Ptr{$tout}), length(A), A, B, out) - vml_check_error() - out - end - function ($jlname)(A::Array{$tout,N}, B::Array{$tin,N}) where {N} - size(A) == size(B) || $(broadcast ? :(return broadcast($jlname, A, B)) : :(throw(DimensionMismatch()))) - out = similar(A) - ccall(($mklfn, lib), Nothing, (Int, Ptr{$tin}, Ptr{$tin}, Ptr{$tout}), length(A), A, B, out) - vml_check_error() - out - end - end -end +include("setup.jl") for t in (Float32, Float64, ComplexF32, ComplexF64) # Unary, real or complex @@ -128,8 +22,8 @@ for t in (Float32, Float64, ComplexF32, ComplexF64) def_unary_op(t, t, :(Base.log), :log!, :Ln) # # Binary, real or complex - # def_binary_op(t, t, :(.^), :pow!, :Pow, true) - # def_binary_op(t, t, :(./), :divide!, :Div, true) + def_binary_op(t, t, :pow, :pow!, :Pow, true) + def_binary_op(t, t, :divide, :divide!, :Div, true) end for t in (Float32, Float64) @@ -145,12 +39,12 @@ for t in (Float32, Float64) def_unary_op(t, t, :(Base.trunc), :trunc!, :Trunc) # now in SpecialFunctions (make smart, maybe?) - # def_unary_op(t, t, :(Base.erf), :erf!, :Erf) - # def_unary_op(t, t, :(Base.erfc), :erfc!, :Erfc) - # def_unary_op(t, t, :(Base.erfinv), :erfinv!, :ErfInv) - # def_unary_op(t, t, :(Base.erfcinv), :erfcinv!, :ErfcInv) - # def_unary_op(t, t, :(Base.lgamma), :lgamma!, :LGamma) - # def_unary_op(t, t, :(Base.gamma), :gamma!, :TGamma) + def_unary_op(t, t, :(SpecialFunctions.erf), :erf!, :Erf) + def_unary_op(t, t, :(SpecialFunctions.erfc), :erfc!, :Erfc) + def_unary_op(t, t, :(SpecialFunctions.erfinv), :erfinv!, :ErfInv) + def_unary_op(t, t, :(SpecialFunctions.erfcinv), :erfcinv!, :ErfcInv) + def_unary_op(t, t, :(SpecialFunctions.lgamma), :lgamma!, :LGamma) + def_unary_op(t, t, :(SpecialFunctions.gamma), :gamma!, :TGamma) # Not in Base def_unary_op(t, t, :inv_cbrt, :inv_cbrt!, :InvCbrt) def_unary_op(t, t, :inv_sqrt, :inv_sqrt!, :InvSqrt) @@ -188,12 +82,12 @@ for t in (Float32, Float64) # end # # Binary, real-only - # def_binary_op(t, t, :(Base.atan2), :atan2!, :Atan2, false) - # def_binary_op(t, t, :(Base.hypot), :hypot!, :Hypot, false) + def_binary_op(t, t, :(Base.atan), :atan!, :Atan, false) + def_binary_op(t, t, :(Base.hypot), :hypot!, :Hypot, false) # Unary, complex-only def_unary_op(t, Complex{t}, :(Base.cis), :cis!, :CIS) - # def_unary_op(Complex{t}, Complex{t}, :(Base.conj), :conj!, :Conj) + def_unary_op(Complex{t}, Complex{t}, :(Base.conj), :conj!, :Conj) def_unary_op(Complex{t}, t, :(Base.abs), :abs!, :Abs) def_unary_op(Complex{t}, t, :(Base.angle), :angle!, :Arg) diff --git a/src/libdetect.jl b/src/libdetect.jl new file mode 100644 index 0000000..726424c --- /dev/null +++ b/src/libdetect.jl @@ -0,0 +1,46 @@ +using CpuId +using Libdl + + +### First Option, MKL.jl install +if !(Base.find_package("MKL") === nothing) + basepath = joinpath(dirname(Base.find_package("MKL")), "../deps/usr/lib") + println("Found MKL.jl package + basepath set to $basepath") + # TODO check whether files are actually there (in case of build error) + +## TODO: standard install (mac, linux) + +### if nothing else, look into ENV +elseif haskey(ENV, "MKL_SL") + basepath = ENV["MKL_SL"] + if !any([occursin("libmkl_rt",x) for x in readdir(basepath)]) + error(""" ENV["MKL_SL"] is set, but does not point to folder containing MKL files """) + end + println("""Found MKL via ENV["MKL_SL"] + basepath set to $basepath""") + +else + error("Could not find VML shared libraries + Check github.com/.... for details on obtaining them") + +end + + +if cpufeature(:AVX2) + const lib = joinpath(basepath, "libmkl_vml_avx2") + println("AVX2 support detected, vml_avx2 selected") +else + const lib = joinpath(basepath, "libmkl_vml_avx") + println("AVX2 support missing, vml_avx selected") +end + +const rtlib = joinpath(basepath, "libmkl_rt") +const corelib = joinpath(basepath, "libmkl_core") + + +Libdl.dlopen(rtlib, RTLD_GLOBAL) + +ccall((:_vmlGetMode, lib), Cuint, ()) + + diff --git a/src/setup.jl b/src/setup.jl new file mode 100644 index 0000000..d8ab6a8 --- /dev/null +++ b/src/setup.jl @@ -0,0 +1,109 @@ + +function __init__() + Libdl.dlopen(rtlib, RTLD_GLOBAL) + Libdl.dlopen(corelib, RTLD_GLOBAL) # maybe only needed on mac + Libdl.dlopen(lib, RTLD_GLOBAL) +end + +__init__() + +struct VMLAccuracy + mode::UInt +end + +const VML_LA = VMLAccuracy(0x00000001) +const VML_HA = VMLAccuracy(0x00000002) +const VML_EP = VMLAccuracy(0x00000003) + + +Base.show(io::IO, m::VMLAccuracy) = print(io, m == VML_LA ? "VML_LA" : + m == VML_HA ? "VML_HA" : "VML_EP") +vml_get_mode() = ccall((:_vmlGetMode, lib), Cuint, ()) +vml_set_mode(mode::Integer) = (ccall((:_vmlSetMode, lib), Cuint, (UInt,), mode); nothing) + +vml_set_accuracy(m::VMLAccuracy) = vml_set_mode((vml_get_mode() & ~0x03) | m.mode) +vml_get_accuracy() = VMLAccuracy(vml_get_mode() & 0x3) + +vml_set_mode((vml_get_mode() & ~0x0000FF00)) +function vml_check_error() + vml_error = ccall((:_vmlClearErrStatus, lib), Cint, ()) + if vml_error != 0 + if vml_error == 1 + throw(DomainError()) + elseif vml_error == 2 || vml_error == 3 || vml_error == 4 + # Singularity, overflow, or underflow + # I don't think Base throws on these + elseif vml_error == 1000 + warn("VML does not support $(vml_get_accuracy); lower accuracy used instead") + else + error("an unexpected error occurred in VML ($vml_error)") + end + end +end + +function vml_prefix(t::DataType) + if t == Float32 + return "_vmls" + elseif t == Float64 + return "_vmld" + elseif t == Complex{Float32} + return "_vmlc" + elseif t == Complex{Float64} + return "_vmlz" + end + error("unknown type $t") +end + +function def_unary_op(tin, tout, jlname, jlname!, mklname) + mklfn = Base.Meta.quot(Symbol("$(vml_prefix(tin))$mklname")) + exports = Symbol[] + (@isdefined jlname) || push!(exports, jlname) + (@isdefined jlname!) || push!(exports, jlname!) + @eval begin + function ($jlname!)(out::Array{$tout,N}, A::Array{$tin,N}) where {N} + size(out) == size(A) || throw(DimensionMismatch()) + ccall(($mklfn, lib), Nothing, (Int, Ptr{$tin}, Ptr{$tout}), length(A), A, out) + vml_check_error() + return out + end + $(if tin == tout + quote + function $(jlname!)(A::Array{$tin}) + ccall(($mklfn, lib), Nothing, (Int, Ptr{$tin}, Ptr{$tout}), length(A), A, A) + vml_check_error() + return A + end + end + end) + function ($jlname)(A::Array{$tin}) + out = similar(A, $tout) + ccall(($mklfn, lib), Nothing, (Int, Ptr{$tin}, Ptr{$tout}), length(A), A, out) + vml_check_error() + return out + end + $(isempty(exports) ? nothing : Expr(:export, exports...)) + end +end + +function def_binary_op(tin, tout, jlname, jlname!, mklname, broadcast) + mklfn = Base.Meta.quot(Symbol("$(vml_prefix(tin))$mklname")) + exports = Symbol[] + (@isdefined jlname) || push!(exports, jlname) + (@isdefined jlname!) || push!(exports, jlname!) + @eval begin + $(isempty(exports) ? nothing : Expr(:export, exports...)) + function ($jlname!)(out::Array{$tout,N}, A::Array{$tin,N}, B::Array{$tin,N}) where {N} + size(out) == size(A) == size(B) || $(broadcast ? :(return broadcast!($jlname, out, A, B)) : :(throw(DimensionMismatch()))) + ccall(($mklfn, lib), Nothing, (Int, Ptr{$tin}, Ptr{$tin}, Ptr{$tout}), length(A), A, B, out) + vml_check_error() + return out + end + function ($jlname)(A::Array{$tout,N}, B::Array{$tin,N}) where {N} + size(A) == size(B) || $(broadcast ? :(return broadcast($jlname, A, B)) : :(throw(DimensionMismatch()))) + out = similar(A) + ccall(($mklfn, lib), Nothing, (Int, Ptr{$tin}, Ptr{$tin}, Ptr{$tout}), length(A), A, B, out) + vml_check_error() + return out + end + end +end \ No newline at end of file From 4553f96333521b5ad3525f30c2dff98111437fa7 Mon Sep 17 00:00:00 2001 From: Steffen Date: Tue, 3 Sep 2019 18:43:34 +0200 Subject: [PATCH 04/29] Updated Readme --- README.md | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index a3d3c1d..39012a2 100644 --- a/README.md +++ b/README.md @@ -7,16 +7,15 @@ faster than using Julia's built-in functions. ## Using VML.jl To use VML.jl, you must have the Intel Vector Math Library installed. -This is included in [MKL](http://software.intel.com/en-us/intel-mkl), -which is free for non-commercial use. You must also copy/symlink the -appropriate shared library to a directory known to the linker (e.g. -`/usr/local/lib`) or you must modify the path to `lib` in `src/VML.jl`. +For this you have two options. First, you can install (and build) [MKL.jl](https://github.com/JuliaComputing/MKL.jl), which will add the necessary libraries to your Julia install. This will change you Julia system image however, so if you would prefer not to do that you can get the stand-alone [MKL](http://software.intel.com/en-us/intel-mkl), +which is free for non-commercial use. The default install location will be detected automatically (currently only `opt/intel/mkl/lib` on Unix). If you have chosen a different location or have multiple versions of MKL, you can also specify the environmental variable +``` + ENV["MKL_SL"] = <.../lib> +``` +This folder should contain `libmkl_rt`, `libmkl_core` and `libmkl_vml_avx` or `libmkl_vml_avx2`, with file ending appropriate for your operating system. +The definition of `ENV["MKL_SL"]` will take precedence even if `MKL.jl` or default standalone MKL are installed. -Currently, VML.jl is configured to use `libmkl_vml_avx`, which requires -AVX support. If your system does not have AVX (e.g., most pre-Sandy -Bridge systems), you will need to modify the `const lib` declaration at -the top of `src/VML.jl`. Future versions of VML.jl may automatically -detect CPU architecture. +Using the beta-stage [CpuId.jl](https://github.com/m-j-w/CpuId.jl) VML.jl detects if your processor supports the newer `avx2` instructions, and if not default to `libmkl_vml_avx`. If your system does not have AVX this package will currently not work for you. After loading VML.jl, vector calls to functions listed below will automatically use VML instead of openlibm when possible. @@ -30,7 +29,7 @@ regarding these options is available on [Intel's website](http://software.intel.com/sites/products/documentation/hpc/mkl/vml/vmldata.htm). ## Performance - +(These results are currently outdated will be updated in due course) ![VML Performance Comparison](/benchmark/performance.png) ![VML Complex Performance Comparison](/benchmark/performance_complex.png) @@ -50,7 +49,7 @@ these are not yet implemented in VML.jl. ### Unary functions Allocating forms have signature `f(A)`. Mutating forms have signatures -`f!(A)` (in place) and `f!(out, A)` (out of place). +`f!(A)` (in place) and `f!(out, A)` (out of place). The last 9 functions have been moved from Base to `SpecialFunctions.jl` or have not Base equivalent. Allocating | Mutating -----------|--------- @@ -82,6 +81,8 @@ Allocating | Mutating `erfc` | `erfc!` `erfinv` | `erfinv!` `efcinv` | `efcinv!` +`gamma` | `gamma!` +`lgamma` | `lgamma!` `inv_cbrt` | `inv_cbrt!` `inv_sqrt` | `inv_sqrt!` `pow2o3` | `pow2o3!` @@ -97,5 +98,9 @@ Allocating | Mutating -----------|--------- `atan2` | `atan2!` `hypot` | `hypot!` -`.^` | `pow!` -`./` | `divide!` +`pow` | `pow!` +`divide` | `divide!` + + +### Next steps +Next steps for this package are proper Windows support, writing up proper testing to make sure each advertised function actually works as expected and build testing on travis. \ No newline at end of file From 679f45da761429c595ad96d92d29b2a1123c654a Mon Sep 17 00:00:00 2001 From: Steffen Date: Tue, 3 Sep 2019 18:51:23 +0200 Subject: [PATCH 05/29] Updated Readme again --- README.md | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 39012a2..1ebe417 100644 --- a/README.md +++ b/README.md @@ -1,24 +1,27 @@ # VML This package provides bindings to the Intel Vector Math Library for -arithmetic and transcendental functions. It is often substantially -faster than using Julia's built-in functions. +arithmetic and transcendental functions. Especially for large vectors it is often substantially faster than broadcasting Julia's built-in functions. -## Using VML.jl +## Setting up VML.jl To use VML.jl, you must have the Intel Vector Math Library installed. -For this you have two options. First, you can install (and build) [MKL.jl](https://github.com/JuliaComputing/MKL.jl), which will add the necessary libraries to your Julia install. This will change you Julia system image however, so if you would prefer not to do that you can get the stand-alone [MKL](http://software.intel.com/en-us/intel-mkl), +For this you have two options. First, you can install (and build) [MKL.jl](https://github.com/JuliaComputing/MKL.jl), which will add the necessary libraries to your Julia install. This will change your Julia system image however, so if you would prefer not to do that you can get the stand-alone [MKL](http://software.intel.com/en-us/intel-mkl), which is free for non-commercial use. The default install location will be detected automatically (currently only `opt/intel/mkl/lib` on Unix). If you have chosen a different location or have multiple versions of MKL, you can also specify the environmental variable ``` ENV["MKL_SL"] = <.../lib> ``` -This folder should contain `libmkl_rt`, `libmkl_core` and `libmkl_vml_avx` or `libmkl_vml_avx2`, with file ending appropriate for your operating system. +The specified folder should contain `libmkl_rt`, `libmkl_core` and `libmkl_vml_avx` or `libmkl_vml_avx2`, with file endings appropriate for your operating system. The definition of `ENV["MKL_SL"]` will take precedence even if `MKL.jl` or default standalone MKL are installed. -Using the beta-stage [CpuId.jl](https://github.com/m-j-w/CpuId.jl) VML.jl detects if your processor supports the newer `avx2` instructions, and if not default to `libmkl_vml_avx`. If your system does not have AVX this package will currently not work for you. +Using [CpuId.jl](https://github.com/m-j-w/CpuId.jl) VML.jl detects if your processor supports the newer `avx2` instructions, and if not default to `libmkl_vml_avx`. If your system does not have AVX this package will currently not work for you. + +If any of this detection does not work for you, please let me know. + +## Using VML.jl After loading VML.jl, vector calls to functions listed below will -automatically use VML instead of openlibm when possible. +automatically use VML instead of openlibm when possible. Note that most function currently do not have a vectorized version (e.g. you call `sin.(rand(300))`), so there should be no conflict. If there is let me know. Updated and conflict tested exported functions are planned for the future. By default, VML uses `VML_HA` mode, which corresponds to an accuracy of <1 ulp, matching the accuracy of Julia's built-in openlibm From 1217b7a5a8f7638c112f30ea59d140a18a845eda Mon Sep 17 00:00:00 2001 From: Steffen Ridderbusch Date: Wed, 4 Sep 2019 15:10:14 -0700 Subject: [PATCH 06/29] Apply suggestions from code review Co-Authored-By: Kristoffer Carlsson --- Project.toml | 2 +- README.md | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Project.toml b/Project.toml index f8b53ce..0c1f3da 100644 --- a/Project.toml +++ b/Project.toml @@ -7,4 +7,4 @@ Libdl = "8f399da3-3557-5675-b5ff-fb832c97cbdb" SpecialFunctions = "276daf66-3868-5448-9aa4-cd146d93841b" [compat] -julia = "≥ 0.7.0" +julia = "≥ 0.7 1.0" diff --git a/README.md b/README.md index 1ebe417..8bce353 100644 --- a/README.md +++ b/README.md @@ -14,9 +14,9 @@ which is free for non-commercial use. The default install location will be detec The specified folder should contain `libmkl_rt`, `libmkl_core` and `libmkl_vml_avx` or `libmkl_vml_avx2`, with file endings appropriate for your operating system. The definition of `ENV["MKL_SL"]` will take precedence even if `MKL.jl` or default standalone MKL are installed. -Using [CpuId.jl](https://github.com/m-j-w/CpuId.jl) VML.jl detects if your processor supports the newer `avx2` instructions, and if not default to `libmkl_vml_avx`. If your system does not have AVX this package will currently not work for you. +Using [CpuId.jl](https://github.com/m-j-w/CpuId.jl), VML.jl detects if your processor supports the newer `avx2` instructions, and if not default to `libmkl_vml_avx`. If your system does not have AVX this package will currently not work for you. -If any of this detection does not work for you, please let me know. +If the CPU feature detection does not work for you, please open an issue. ## Using VML.jl @@ -52,7 +52,7 @@ these are not yet implemented in VML.jl. ### Unary functions Allocating forms have signature `f(A)`. Mutating forms have signatures -`f!(A)` (in place) and `f!(out, A)` (out of place). The last 9 functions have been moved from Base to `SpecialFunctions.jl` or have not Base equivalent. +`f!(A)` (in place) and `f!(out, A)` (out of place). The last 9 functions have been moved from Base to `SpecialFunctions.jl` or have no Base equivalent. Allocating | Mutating -----------|--------- @@ -106,4 +106,4 @@ Allocating | Mutating ### Next steps -Next steps for this package are proper Windows support, writing up proper testing to make sure each advertised function actually works as expected and build testing on travis. \ No newline at end of file +Next steps for this package are proper Windows support, writing up proper testing to make sure each advertised function actually works as expected and build testing on travis. From 79f1295752b6e47ba68f210c6f1b1191f653128a Mon Sep 17 00:00:00 2001 From: Steffen Ridderbusch Date: Thu, 5 Sep 2019 18:25:08 -0700 Subject: [PATCH 07/29] Fixed atan with two arguments --- src/VML.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/VML.jl b/src/VML.jl index cca9e42..d98bd13 100644 --- a/src/VML.jl +++ b/src/VML.jl @@ -82,7 +82,7 @@ for t in (Float32, Float64) # end # # Binary, real-only - def_binary_op(t, t, :(Base.atan), :atan!, :Atan, false) + def_binary_op(t, t, :(Base.atan), :atan!, :Atan2, false) def_binary_op(t, t, :(Base.hypot), :hypot!, :Hypot, false) # Unary, complex-only From b8bde8f2ea6540624a20877974017310dde75d6b Mon Sep 17 00:00:00 2001 From: Steffen Date: Mon, 28 Oct 2019 00:14:21 +0000 Subject: [PATCH 08/29] Updated and ran tests --- Project.toml | 6 ++++++ src/VML.jl | 1 - src/setup.jl | 2 +- test/common.jl | 39 +++++++++++++++++++++------------------ test/complex.jl | 26 ++++++++++++++------------ test/real.jl | 41 +++++++++++++++++++++++++---------------- test/runtests.jl | 3 +++ 7 files changed, 70 insertions(+), 48 deletions(-) diff --git a/Project.toml b/Project.toml index 0c1f3da..8e73420 100644 --- a/Project.toml +++ b/Project.toml @@ -8,3 +8,9 @@ SpecialFunctions = "276daf66-3868-5448-9aa4-cd146d93841b" [compat] julia = "≥ 0.7 1.0" + +[extras] +Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[targets] +test = ["Test"] diff --git a/src/VML.jl b/src/VML.jl index d98bd13..e13036c 100644 --- a/src/VML.jl +++ b/src/VML.jl @@ -86,7 +86,6 @@ for t in (Float32, Float64) def_binary_op(t, t, :(Base.hypot), :hypot!, :Hypot, false) # Unary, complex-only - def_unary_op(t, Complex{t}, :(Base.cis), :cis!, :CIS) def_unary_op(Complex{t}, Complex{t}, :(Base.conj), :conj!, :Conj) def_unary_op(Complex{t}, t, :(Base.abs), :abs!, :Abs) def_unary_op(Complex{t}, t, :(Base.angle), :angle!, :Arg) diff --git a/src/setup.jl b/src/setup.jl index d8ab6a8..2015493 100644 --- a/src/setup.jl +++ b/src/setup.jl @@ -29,7 +29,7 @@ function vml_check_error() vml_error = ccall((:_vmlClearErrStatus, lib), Cint, ()) if vml_error != 0 if vml_error == 1 - throw(DomainError()) + throw(DomainError(-1, "This function does not support arguments outside its domain")) elseif vml_error == 2 || vml_error == 3 || vml_error == 4 # Singularity, overflow, or underflow # I don't think Base throws on these diff --git a/test/common.jl b/test/common.jl index c437e43..4e73fa5 100644 --- a/test/common.jl +++ b/test/common.jl @@ -1,3 +1,4 @@ +using SpecialFunctions const base_unary_real = ( (Base.acos, (-1, 1)), (Base.asin, (-1, 1)), @@ -24,19 +25,19 @@ const base_unary_real = ( (Base.floor, (-1000, 1000)), (Base.round, (-1000, 1000)), (Base.trunc, (-1000, 1000)), - (Base.erf, (-3.8325067f0, 3.8325067f0)), - (Base.erfc, (-3.7439213f0, 10.019834f0)), - (Base.erfinv, (-1, 1)), - (Base.erfcinv, (0, 2)), - (Base.lgamma, (0, 1000)), - (Base.gamma, (0, 36)) + (SpecialFunctions.erf, (-3.8325067f0, 3.8325067f0)), + (SpecialFunctions.erfc, (-3.7439213f0, 10.019834f0)), + (SpecialFunctions.erfinv, (-1, 1)), + (SpecialFunctions.erfcinv, (0, 2)), + (SpecialFunctions.lgamma, (0, 1000)), + (SpecialFunctions.gamma, (0, 36)) ) const base_binary_real = ( - (Base.atan2, (-1, 1), (-1, 1)), + (Base.atan, (-1, 1), (-1, 1)), (Base.hypot, (-1000, 1000), (-1000, 1000)), - (getfield(Base, :./), (-1000, 1000), (-1000, 1000)), - (getfield(Base, :.^), (0, 100), (-5, 20)) + # (getfield(Base, :./), (-1000, 1000), (-1000, 1000)), + # (getfield(Base, :.^), (0, 100), (-5, 20)) ) const base_unary_complex = ( @@ -57,16 +58,17 @@ const base_unary_complex = ( (Base.log, (0, 1000)), # (Base.log10, (0, 1000)), (Base.abs, (-1000, 1000)), - (Base.angle, (-1000, 1000)) - # (Base.conj, (-1000, 1000)) + (Base.angle, (-1000, 1000)), + (Base.conj, (-1000, 1000)), + # (Base.cis, (-1000, 1000)) ) -const base_binary_complex = ( - (getfield(Base, :./), (-1000, 1000), (-1000, 1000)), - # (Base.(:.^), (0, 100), (-2, 10)) -) +# const base_binary_complex = ( +# # (getfield(Base, :./), (-1000, 1000), (-1000, 1000)), +# # (Base.(:.^), (0, 100), (-2, 10)) +# ) -function randindomain{T<:Real}(t::Type{T}, n, domain) +function randindomain(t::Type{T}, n, domain) where {T<:Real} d1 = convert(t, domain[1]) d2 = convert(t, domain[2]) ddiff = d2 - d1 @@ -78,7 +80,7 @@ function randindomain{T<:Real}(t::Type{T}, n, domain) v end -function randindomain{T<:Complex}(t::Type{T}, n, domain) +function randindomain(t::Type{T}, n, domain) where {T<:Complex} d1 = convert(t, domain[1]) d2 = convert(t, domain[2]) ddiff = d2 - d1 @@ -87,5 +89,6 @@ function randindomain{T<:Complex}(t::Type{T}, n, domain) for i = 1:length(v) v[i] = v[i]*ddiff+d1 end - reinterpret(t, v) + v + # reinterpret(t, v) end diff --git a/test/complex.jl b/test/complex.jl index b7560b8..365b78d 100644 --- a/test/complex.jl +++ b/test/complex.jl @@ -1,16 +1,18 @@ # First generate some random data and test functions in Base on it const NVALS = 1000 -input = Dict(t=>[[(randindomain(t, NVALS, domain),) for (fn, domain) in base_unary_complex]; - [(randindomain(t, NVALS, domain1), randindomain(t, NVALS, domain2)) - for (fn, domain1, domain2) in base_binary_complex]; - (randindomain(t, NVALS, (0, 100)), randindomain(t, 1, (-2, 10))[1])] - for t in (Complex64, Complex128)) -fns = [[x[1] for x in base_unary_complex]; [x[1] for x in base_binary_complex]; .^] -output = Dict(t=>[fns[i](input[t][i]...) for i = 1:length(fns)] for t in (Complex64, Complex128)) +input = Dict(t=>[(randindomain(t, NVALS, domain),) for (_, domain) in base_unary_complex] + for t in (ComplexF32, ComplexF64)) +fns = [x[1] for x in base_unary_complex] +output = Dict(t=>[fns[i](input[t][i]...) for i = 1:length(fns)] + for t in (ComplexF32, ComplexF64)) -# Now test the same data with VML -using VML -for t in (Complex64, Complex128), i = 1:length(fns) +@testset "Definitions and Comparison with Base for Complex" begin + + for t in (ComplexF32, ComplexF64), i = 1:length(fns) fn = fns[i] - Base.Test.test_approx_eq(output[t][i], fn(input[t][i]...), "Base $t $fn", "VML $t $fn") -end + Test.@test which(fn, typeof(input[t][i])).module == VML + # Test.test_approx_eq(output[t][i], fn(input[t][i]...), "Base $t $fn", "VML $t $fn") + Test.@test fn(input[t][i]...) ≈ fn.(input[t][i]...) + end + +end \ No newline at end of file diff --git a/test/real.jl b/test/real.jl index d17bbc3..dbe3a1d 100644 --- a/test/real.jl +++ b/test/real.jl @@ -1,25 +1,34 @@ # First generate some random data and test functions in Base on it const NVALS = 1000 -input = Dict(t=>[[(randindomain(t, NVALS, domain),) for (fn, domain) in base_unary_real]; +input = Dict(t=>[[(randindomain(t, NVALS, domain),) for (_, domain) in base_unary_real]; [(randindomain(t, NVALS, domain1), randindomain(t, NVALS, domain2)) - for (fn, domain1, domain2) in base_binary_real]; - (randindomain(t, NVALS, (0, 100)), randindomain(t, 1, (-5, 20))[1])] + for (_, domain1, domain2) in base_binary_real]] for t in (Float32, Float64)) -fns = [[x[1] for x in base_unary_real]; [x[1] for x in base_binary_real]; .^] -output = Dict(t=>[fns[i](input[t][i]...) for i = 1:length(fns)] for t in (Float32, Float64)) +fns = [[x[1] for x in base_unary_real]; [x[1] for x in base_binary_real]] +# output = Dict(t=>[fns[i](input[t][i]...) for i = 1:length(fns)] for t in (Float32, Float64)) -# Now test the same data with VML -using VML -for t in (Float32, Float64), i = 1:length(fns) + +@testset "Definitions and Comparison with Base for Reals" begin + + for t in (Float32, Float64), i = 1:length(fns) + fn = fns[i] - Base.Test.test_approx_eq(output[t][i], fn(input[t][i]...), "Base $t $fn", "VML $t $fn") + Test.@test which(fn, typeof(input[t][i])).module == VML + # Test.test_approx_eq(output[t][i], fn(input[t][i]...), "Base $t $fn", "VML $t $fn") + Test.@test fn(input[t][i]...) ≈ fn.(input[t][i]...) + end + end -# Verify that we still throw DomainErrors -Base.Test.@test_throws DomainError sqrt([-1.0]) +@testset "Error Handling and Settings" begin -# Setting accuracy -vml_set_accuracy(VML_LA) -@assert vml_get_accuracy() == VML_LA -vml_set_accuracy(VML_EP) -@assert vml_get_accuracy() == VML_EP + # Verify that we still throw DomainErrors + Test.@test_throws DomainError sqrt([-1.0]) + + # Setting accuracy + vml_set_accuracy(VML_LA) + Test.@test vml_get_accuracy() == VML_LA + vml_set_accuracy(VML_EP) + Test.@test vml_get_accuracy() == VML_EP + +end diff --git a/test/runtests.jl b/test/runtests.jl index 41cde16..fa7a2ad 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -1,3 +1,6 @@ +using Test +using VML + include("common.jl") include("real.jl") include("complex.jl") From c6265a6c6f7424acda096bb1f3fb65c5dd6a20d1 Mon Sep 17 00:00:00 2001 From: Steffen Date: Mon, 28 Oct 2019 18:12:40 +0000 Subject: [PATCH 09/29] Changed library detection and loading --- deps/build.jl | 67 ++++++------------------------------------------ src/libdetect.jl | 46 --------------------------------- 2 files changed, 8 insertions(+), 105 deletions(-) delete mode 100644 src/libdetect.jl diff --git a/deps/build.jl b/deps/build.jl index 24e9d17..dec4784 100644 --- a/deps/build.jl +++ b/deps/build.jl @@ -2,69 +2,18 @@ using CpuId using Libdl - -function defMKLpath() - if Sys.isunix() - return "/opt/intel/mkl/lib" - # elseif Sys.iswindows() - # return - else - return "" - end -end - - - -### First Option, check for user preference -if haskey(ENV, "MKL_SL") - basepath = ENV["MKL_SL"] - if !any([occursin("libmkl_rt",x) for x in readdir(basepath)]) - error(""" ENV["MKL_SL"] is set, but does not point to folder containing MKL files """) - end - println("""Found MKL via ENV["MKL_SL"] - basepath set to $basepath""") - -### Next, check if MKL.jl is already installed. -# Don't want to add to deps, so bit hacky -else - foundMKLjl = [isdir(joinpath(testdir, "packages/MKL")) for testdir in DEPOT_PATH] - - if any(foundMKLjl) - pkgPath = joinpath(DEPOT_PATH[findfirst(foundMKLjl)], "packages/MKL/") - - shortID = readdir(pkgPath)[1] - - basepath = joinpath(pkgPath, shortID, "deps/usr/lib") - - if isdir(basepath) - println("Found MKL.jl package - basepath set to $basepath") - else - error("Found MKL package folder, but MKL libraries at deps/usr/lib are missing - Please rebuild MKL") - end - - elseif isdir(defMKLpath()) - basepath = defMKLpath() - - else - error("Could not find VML shared libraries - Check github.com/.... for details on obtaining them") - - end -end - +## this lets us load CpuId only once if cpufeature(:AVX2) - lib = joinpath(basepath, "libmkl_vml_avx2") + lib = :libmkl_vml_avx2 println("AVX2 support detected, vml_avx2 selected") else - lib = joinpath(basepath, "libmkl_vml_avx") + lib = :libmkl_vml_avx println("AVX2 support missing, vml_avx selected") end -rtlib = joinpath(basepath, "libmkl_rt") -corelib = joinpath(basepath, "libmkl_core") +rtlib = :libmkl_rt +corelib = :libmkl_core depsjl_path = joinpath(@__DIR__, "deps.jl") @@ -74,8 +23,8 @@ open(depsjl_path, "w") do depsjl_file ## Do not edit. import Libdl - const lib = "$lib" - const rtlib = "$rtlib" - const corelib = "$corelib" + const lib = :$lib + const rtlib = :$rtlib + const corelib = :$corelib """)) end \ No newline at end of file diff --git a/src/libdetect.jl b/src/libdetect.jl deleted file mode 100644 index 726424c..0000000 --- a/src/libdetect.jl +++ /dev/null @@ -1,46 +0,0 @@ -using CpuId -using Libdl - - -### First Option, MKL.jl install -if !(Base.find_package("MKL") === nothing) - basepath = joinpath(dirname(Base.find_package("MKL")), "../deps/usr/lib") - println("Found MKL.jl package - basepath set to $basepath") - # TODO check whether files are actually there (in case of build error) - -## TODO: standard install (mac, linux) - -### if nothing else, look into ENV -elseif haskey(ENV, "MKL_SL") - basepath = ENV["MKL_SL"] - if !any([occursin("libmkl_rt",x) for x in readdir(basepath)]) - error(""" ENV["MKL_SL"] is set, but does not point to folder containing MKL files """) - end - println("""Found MKL via ENV["MKL_SL"] - basepath set to $basepath""") - -else - error("Could not find VML shared libraries - Check github.com/.... for details on obtaining them") - -end - - -if cpufeature(:AVX2) - const lib = joinpath(basepath, "libmkl_vml_avx2") - println("AVX2 support detected, vml_avx2 selected") -else - const lib = joinpath(basepath, "libmkl_vml_avx") - println("AVX2 support missing, vml_avx selected") -end - -const rtlib = joinpath(basepath, "libmkl_rt") -const corelib = joinpath(basepath, "libmkl_core") - - -Libdl.dlopen(rtlib, RTLD_GLOBAL) - -ccall((:_vmlGetMode, lib), Cuint, ()) - - From 35d0ef4fb59cad5c0f42b2294c92c066c6095527 Mon Sep 17 00:00:00 2001 From: Steffen Date: Mon, 28 Oct 2019 18:40:53 +0000 Subject: [PATCH 10/29] Updated Readme --- README.md | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 8bce353..9caafd7 100644 --- a/README.md +++ b/README.md @@ -7,12 +7,10 @@ arithmetic and transcendental functions. Especially for large vectors it is ofte To use VML.jl, you must have the Intel Vector Math Library installed. For this you have two options. First, you can install (and build) [MKL.jl](https://github.com/JuliaComputing/MKL.jl), which will add the necessary libraries to your Julia install. This will change your Julia system image however, so if you would prefer not to do that you can get the stand-alone [MKL](http://software.intel.com/en-us/intel-mkl), -which is free for non-commercial use. The default install location will be detected automatically (currently only `opt/intel/mkl/lib` on Unix). If you have chosen a different location or have multiple versions of MKL, you can also specify the environmental variable -``` - ENV["MKL_SL"] = <.../lib> -``` -The specified folder should contain `libmkl_rt`, `libmkl_core` and `libmkl_vml_avx` or `libmkl_vml_avx2`, with file endings appropriate for your operating system. -The definition of `ENV["MKL_SL"]` will take precedence even if `MKL.jl` or default standalone MKL are installed. +which is free for non-commercial use. + +Libdl automatically finds the relevant libraries in the default search locations. This already the case if you use MKL.jl, but the stand-alone may require you to source `mklvars.sh`. The default command on Mac and Ubuntu is `source /opt/intel/mkl/bin/mklvars.sh intel64`. You may want to add this to your `.bashrc`. +Adding a new `*.conf` file in `/etc/ld.so.conf.d` also works, as the `intel-mkl-slim` package in the AUR does automatically. Using [CpuId.jl](https://github.com/m-j-w/CpuId.jl), VML.jl detects if your processor supports the newer `avx2` instructions, and if not default to `libmkl_vml_avx`. If your system does not have AVX this package will currently not work for you. @@ -32,7 +30,7 @@ regarding these options is available on [Intel's website](http://software.intel.com/sites/products/documentation/hpc/mkl/vml/vmldata.htm). ## Performance -(These results are currently outdated will be updated in due course) +(These results are currently outdated and will be updated in due course) ![VML Performance Comparison](/benchmark/performance.png) ![VML Complex Performance Comparison](/benchmark/performance_complex.png) @@ -94,12 +92,11 @@ Allocating | Mutating ### Binary functions Allocating forms have signature `f(A, B)`. Mutating forms have -signature `f!(out, A, B)`. These functions fall back on broadcasting -when +signature `f!(out, A, B)`. Allocating | Mutating -----------|--------- -`atan2` | `atan2!` +`atan` | `atan!` `hypot` | `hypot!` `pow` | `pow!` `divide` | `divide!` From baef2d0896e9538bd68938453e6b661fcae4e69b Mon Sep 17 00:00:00 2001 From: Steffen Ridderbusch Date: Wed, 13 Nov 2019 12:01:16 +0000 Subject: [PATCH 11/29] Added library names on windows --- deps/build.jl | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/deps/build.jl b/deps/build.jl index dec4784..1d48fdd 100644 --- a/deps/build.jl +++ b/deps/build.jl @@ -5,15 +5,22 @@ using Libdl ## this lets us load CpuId only once if cpufeature(:AVX2) - lib = :libmkl_vml_avx2 + libsuffix = :avx2 println("AVX2 support detected, vml_avx2 selected") else - lib = :libmkl_vml_avx + libsuffix = :avx println("AVX2 support missing, vml_avx selected") end -rtlib = :libmkl_rt -corelib = :libmkl_core +if Sys.iswindows() + rtlib = :mkl_rt + corelib = :mkl_core + lib = Symbol(:mkl_vml_, libsuffix) +else + rtlib = :libmkl_rt + corelib = :libmkl_core + lib = Symbol(:libmkl_vml_, libsuffix) +end depsjl_path = joinpath(@__DIR__, "deps.jl") @@ -27,4 +34,4 @@ open(depsjl_path, "w") do depsjl_file const rtlib = :$rtlib const corelib = :$corelib """)) -end \ No newline at end of file +end From 127a980a15324499e9532eca57718d09b6f34cac Mon Sep 17 00:00:00 2001 From: Steffen Date: Wed, 20 Nov 2019 17:50:30 +0000 Subject: [PATCH 12/29] Adding MKL path to Libdl on Mac/Linux --- deps/build.jl | 16 ++++++++++++++++ src/setup.jl | 3 +++ 2 files changed, 19 insertions(+) diff --git a/deps/build.jl b/deps/build.jl index 1d48fdd..067ad95 100644 --- a/deps/build.jl +++ b/deps/build.jl @@ -12,11 +12,21 @@ else println("AVX2 support missing, vml_avx selected") end +addlibpath = false + if Sys.iswindows() rtlib = :mkl_rt corelib = :mkl_core lib = Symbol(:mkl_vml_, libsuffix) else + try + using MKL + mklpath = Base.pathof(MKL) + libpath = normpath(joinpath(dirname(mklpath), "../deps/usr/lib")) + addlibpath = true + catch + println("MKL.jl not found") + end rtlib = :libmkl_rt corelib = :libmkl_core lib = Symbol(:libmkl_vml_, libsuffix) @@ -33,5 +43,11 @@ open(depsjl_path, "w") do depsjl_file const lib = :$lib const rtlib = :$rtlib const corelib = :$corelib + const addlibpath = :$addlibpath + """)) + if addlibpath + println(depsjl_file, strip(""" + const libpath = :$libpath """)) + end end diff --git a/src/setup.jl b/src/setup.jl index 2015493..0912d4e 100644 --- a/src/setup.jl +++ b/src/setup.jl @@ -3,6 +3,9 @@ function __init__() Libdl.dlopen(rtlib, RTLD_GLOBAL) Libdl.dlopen(corelib, RTLD_GLOBAL) # maybe only needed on mac Libdl.dlopen(lib, RTLD_GLOBAL) + if addlibpath + push!(Libdl.DL_LOAD_PATH, libpath) + end end __init__() From a41c695b87dc8987457f4e3d786b37bd95e5aee1 Mon Sep 17 00:00:00 2001 From: Michael Abbott Date: Wed, 13 Nov 2019 14:35:20 +0100 Subject: [PATCH 13/29] first pass, remove Base., simple overload macro --- src/VML.jl | 96 +++++++++++++++++++++++++++++++----------------------- 1 file changed, 55 insertions(+), 41 deletions(-) diff --git a/src/VML.jl b/src/VML.jl index e13036c..5b307c4 100644 --- a/src/VML.jl +++ b/src/VML.jl @@ -13,13 +13,13 @@ include("setup.jl") for t in (Float32, Float64, ComplexF32, ComplexF64) # Unary, real or complex - def_unary_op(t, t, :(Base.acos), :acos!, :Acos) - def_unary_op(t, t, :(Base.asin), :asin!, :Asin) - def_unary_op(t, t, :(Base.acosh), :acosh!, :Acosh) - def_unary_op(t, t, :(Base.asinh), :asinh!, :Asinh) - def_unary_op(t, t, :(Base.sqrt), :sqrt!, :Sqrt) - def_unary_op(t, t, :(Base.exp), :exp!, :Exp) - def_unary_op(t, t, :(Base.log), :log!, :Ln) + def_unary_op(t, t, :acos, :acos!, :Acos) + def_unary_op(t, t, :asin, :asin!, :Asin) + def_unary_op(t, t, :acosh, :acosh!, :Acosh) + def_unary_op(t, t, :asinh, :asinh!, :Asinh) + def_unary_op(t, t, :sqrt, :sqrt!, :Sqrt) + def_unary_op(t, t, :exp, :exp!, :Exp) + def_unary_op(t, t, :log, :log!, :Ln) # # Binary, real or complex def_binary_op(t, t, :pow, :pow!, :Pow, true) @@ -28,23 +28,23 @@ end for t in (Float32, Float64) # Unary, real-only - def_unary_op(t, t, :(Base.cbrt), :cbrt!, :Cbrt) - def_unary_op(t, t, :(Base.expm1), :expm1!, :Expm1) - def_unary_op(t, t, :(Base.log1p), :log1p, :Log1p) - def_unary_op(t, t, :(Base.abs), :abs!, :Abs) - def_unary_op(t, t, :(Base.abs2), :abs2!, :Sqr) - def_unary_op(t, t, :(Base.ceil), :ceil!, :Ceil) - def_unary_op(t, t, :(Base.floor), :floor!, :Floor) - def_unary_op(t, t, :(Base.round), :round!, :Round) - def_unary_op(t, t, :(Base.trunc), :trunc!, :Trunc) + def_unary_op(t, t, :cbrt, :cbrt!, :Cbrt) + def_unary_op(t, t, :expm1, :expm1!, :Expm1) + def_unary_op(t, t, :log1p, :log1p, :Log1p) + def_unary_op(t, t, :abs, :abs!, :Abs) + def_unary_op(t, t, :abs2, :abs2!, :Sqr) + def_unary_op(t, t, :ceil, :ceil!, :Ceil) + def_unary_op(t, t, :floor, :floor!, :Floor) + def_unary_op(t, t, :round, :round!, :Round) + def_unary_op(t, t, :trunc, :trunc!, :Trunc) # now in SpecialFunctions (make smart, maybe?) - def_unary_op(t, t, :(SpecialFunctions.erf), :erf!, :Erf) - def_unary_op(t, t, :(SpecialFunctions.erfc), :erfc!, :Erfc) - def_unary_op(t, t, :(SpecialFunctions.erfinv), :erfinv!, :ErfInv) - def_unary_op(t, t, :(SpecialFunctions.erfcinv), :erfcinv!, :ErfcInv) - def_unary_op(t, t, :(SpecialFunctions.lgamma), :lgamma!, :LGamma) - def_unary_op(t, t, :(SpecialFunctions.gamma), :gamma!, :TGamma) + def_unary_op(t, t, :erf, :erf!, :Erf) + def_unary_op(t, t, :erfc, :erfc!, :Erfc) + def_unary_op(t, t, :erfinv, :erfinv!, :ErfInv) + def_unary_op(t, t, :erfcinv, :erfcinv!, :ErfcInv) + def_unary_op(t, t, :lgamma, :lgamma!, :LGamma) + def_unary_op(t, t, :gamma, :gamma!, :TGamma) # Not in Base def_unary_op(t, t, :inv_cbrt, :inv_cbrt!, :InvCbrt) def_unary_op(t, t, :inv_sqrt, :inv_sqrt!, :InvSqrt) @@ -53,15 +53,15 @@ for t in (Float32, Float64) # Enabled only for Real. MKL guarantees higher accuracy, but at a # substantial performance cost. - def_unary_op(t, t, :(Base.atan), :atan!, :Atan) - def_unary_op(t, t, :(Base.cos), :cos!, :Cos) - def_unary_op(t, t, :(Base.sin), :sin!, :Sin) - def_unary_op(t, t, :(Base.tan), :tan!, :Tan) - def_unary_op(t, t, :(Base.atanh), :atanh!, :Atanh) - def_unary_op(t, t, :(Base.cosh), :cosh!, :Cosh) - def_unary_op(t, t, :(Base.sinh), :sinh!, :Sinh) - def_unary_op(t, t, :(Base.tanh), :tanh!, :Tanh) - def_unary_op(t, t, :(Base.log10), :log10!, :Log10) + def_unary_op(t, t, :atan, :atan!, :Atan) + def_unary_op(t, t, :cos, :cos!, :Cos) + def_unary_op(t, t, :sin, :sin!, :Sin) + def_unary_op(t, t, :tan, :tan!, :Tan) + def_unary_op(t, t, :atanh, :atanh!, :Atanh) + def_unary_op(t, t, :cosh, :cosh!, :Cosh) + def_unary_op(t, t, :sinh, :sinh!, :Sinh) + def_unary_op(t, t, :tanh, :tanh!, :Tanh) + def_unary_op(t, t, :log10, :log10!, :Log10) # # .^ to scalar power # mklfn = Base.Meta.quot(Symbol("$(vml_prefix(t))Powx")) @@ -82,24 +82,38 @@ for t in (Float32, Float64) # end # # Binary, real-only - def_binary_op(t, t, :(Base.atan), :atan!, :Atan2, false) - def_binary_op(t, t, :(Base.hypot), :hypot!, :Hypot, false) + def_binary_op(t, t, :atan, :atan!, :Atan2, false) + def_binary_op(t, t, :hypot, :hypot!, :Hypot, false) # Unary, complex-only - def_unary_op(Complex{t}, Complex{t}, :(Base.conj), :conj!, :Conj) - def_unary_op(Complex{t}, t, :(Base.abs), :abs!, :Abs) - def_unary_op(Complex{t}, t, :(Base.angle), :angle!, :Arg) + def_unary_op(Complex{t}, Complex{t}, :conj, :conj!, :Conj) + def_unary_op(Complex{t}, t, :abs, :abs!, :Abs) + def_unary_op(Complex{t}, t, :angle, :angle!, :Arg) # Binary, complex-only. These are more accurate but performance is # either equivalent to Base or slower. - # def_binary_op(Complex{t}, Complex{t}, :(Base.(:+)), :add!, :Add, false) - # def_binary_op(Complex{t}, Complex{t}, :(Base.(:.+)), :add!, :Add, true) - # def_binary_op(Complex{t}, Complex{t}, :(Base.(:.*)), :multiply!, :Mul, true) - # def_binary_op(Complex{t}, Complex{t}, :(Base.(:-)), :subtract!, :Sub, false) - # def_binary_op(Complex{t}, Complex{t}, :(Base.(:.-)), :subtract!, :Sub, true) + # def_binary_op(Complex{t}, Complex{t}, (:+), :add!, :Add, false) + # def_binary_op(Complex{t}, Complex{t}, (:.+), :add!, :Add, true) + # def_binary_op(Complex{t}, Complex{t}, (:.*), :multiply!, :Mul, true) + # def_binary_op(Complex{t}, Complex{t}, (:-), :subtract!, :Sub, false) + # def_binary_op(Complex{t}, Complex{t}, (:.-), :subtract!, :Sub, true) # def_binary_op(Complex{t}, Complex{t}, :multiply_conj, :multiply_conj!, :Mul, false) end +""" + @overload exp log sin + +This macro adds a method to each function, so that when acting on an array, +it calls the `VML` version. The existing action on scalars is unaffected. + +That is, it defines `Base.exp(A::AbstractArray) = VML.exp(A)` etc, +while leaving `exp.(A)` alone. +""" +macro overload(funs...) + defs = [:( Base.$f(A::AbstractArray) = VML.$f(A) ) for f in funs ] + esc(Expr(:block, defs...)) +end + export VML_LA, VML_HA, VML_EP, vml_set_accuracy, vml_get_accuracy end From de1b2fe7edd27f0565bec8cde5eb05d633419e17 Mon Sep 17 00:00:00 2001 From: Michael Abbott Date: Wed, 13 Nov 2019 17:19:19 +0100 Subject: [PATCH 14/29] more, still untested --- src/VML.jl | 40 ++++++++++++++---- src/setup.jl | 6 ++- test/common.jl | 108 ++++++++++++++++++++++++------------------------- 3 files changed, 91 insertions(+), 63 deletions(-) diff --git a/src/VML.jl b/src/VML.jl index 5b307c4..725ea0e 100644 --- a/src/VML.jl +++ b/src/VML.jl @@ -103,17 +103,41 @@ end """ @overload exp log sin -This macro adds a method to each function, so that when acting on an array, -it calls the `VML` version. The existing action on scalars is unaffected. - -That is, it defines `Base.exp(A::AbstractArray) = VML.exp(A)` etc, -while leaving `exp.(A)` alone. +This macro adds a method to each function, so that when acting on an array +(or two arrays) it calls the `VML` version. The existing action on scalars is unaffected. """ macro overload(funs...) - defs = [:( Base.$f(A::AbstractArray) = VML.$f(A) ) for f in funs ] - esc(Expr(:block, defs...)) + out = quote end + say = [] + for f in funs + if f in _UNARY + if isdefined(Base, f) + push!(out.args, :( Base.$f(A::Array) = VML.$f(A) )) + push!(say, "Base.$f(A)") + elseif isdefined(SpecialFunctions, f) + push!(out.args, :( VML.SpecialFunctions.$f(A::Array) = VML.$f(A) )) + push!(say, "SpecialFunctions.$f(A)") + else + @error "function VML.$f is not defined in Base or SpecialFunctions, so there is nothing to overload" + end + end + if f in _BINARY + if isdefined(Base, f) + push!(out.args, :( Base.$f(A::Array, B::Array) = VML.$f(A, B) )) + push!(say, "Base.$f(A, B)") + else + @error "function VML.$f is not defined in Base, so there is nothing to overload" + end + end + if !(f in _UNARY) && !(f in _BINARY) + error("there is no function $f defined by VML.jl") + end + end + str = string("Overloaded these functions: \n ", join(say, " \n ")) + push!(out.args, str) + esc(out) end -export VML_LA, VML_HA, VML_EP, vml_set_accuracy, vml_get_accuracy +export VML_LA, VML_HA, VML_EP, vml_set_accuracy, vml_get_accuracy, @overload end diff --git a/src/setup.jl b/src/setup.jl index 0912d4e..e6627cb 100644 --- a/src/setup.jl +++ b/src/setup.jl @@ -18,6 +18,8 @@ const VML_LA = VMLAccuracy(0x00000001) const VML_HA = VMLAccuracy(0x00000002) const VML_EP = VMLAccuracy(0x00000003) +const _UNARY = [] # for @overload to check +const _BINARY = [] Base.show(io::IO, m::VMLAccuracy) = print(io, m == VML_LA ? "VML_LA" : m == VML_HA ? "VML_HA" : "VML_EP") @@ -62,6 +64,7 @@ function def_unary_op(tin, tout, jlname, jlname!, mklname) exports = Symbol[] (@isdefined jlname) || push!(exports, jlname) (@isdefined jlname!) || push!(exports, jlname!) + push!(_UNARY, jlname) @eval begin function ($jlname!)(out::Array{$tout,N}, A::Array{$tin,N}) where {N} size(out) == size(A) || throw(DimensionMismatch()) @@ -93,6 +96,7 @@ function def_binary_op(tin, tout, jlname, jlname!, mklname, broadcast) exports = Symbol[] (@isdefined jlname) || push!(exports, jlname) (@isdefined jlname!) || push!(exports, jlname!) + push!(_BINARY, jlname) @eval begin $(isempty(exports) ? nothing : Expr(:export, exports...)) function ($jlname!)(out::Array{$tout,N}, A::Array{$tin,N}, B::Array{$tin,N}) where {N} @@ -109,4 +113,4 @@ function def_binary_op(tin, tout, jlname, jlname!, mklname, broadcast) return out end end -end \ No newline at end of file +end diff --git a/test/common.jl b/test/common.jl index 4e73fa5..4bc9c94 100644 --- a/test/common.jl +++ b/test/common.jl @@ -1,71 +1,71 @@ using SpecialFunctions const base_unary_real = ( - (Base.acos, (-1, 1)), - (Base.asin, (-1, 1)), - (Base.atan, (-50, 50)), - (Base.cos, (-1000, 1000)), - (Base.sin, (-1000, 1000)), - (Base.tan, (-1000, 1000)), - (Base.acosh, (1, 1000)), - (Base.asinh, (-1000, 1000)), - (Base.atanh, (-1, 1)), - (Base.cosh, (0, 89.415985f0)), - (Base.sinh, (-89.415985f0, 89.415985f0)), - (Base.tanh, (-8.66434f0, 8.66434f0)), - (Base.cbrt, (-1000, 1000)), - (Base.sqrt, (0, 1000)), - (Base.exp, (-88.72284f0, 88.72284f0)), - (Base.expm1, (-88.72284f0, 88.72284f0)), - (Base.log, (0, 1000)), - (Base.log10, (0, 1000)), - (Base.log1p, (-1, 1000)), - (Base.abs, (-1000, 1000)), - (Base.abs2, (-1000, 1000)), - (Base.ceil, (-1000, 1000)), - (Base.floor, (-1000, 1000)), - (Base.round, (-1000, 1000)), - (Base.trunc, (-1000, 1000)), - (SpecialFunctions.erf, (-3.8325067f0, 3.8325067f0)), - (SpecialFunctions.erfc, (-3.7439213f0, 10.019834f0)), - (SpecialFunctions.erfinv, (-1, 1)), - (SpecialFunctions.erfcinv, (0, 2)), - (SpecialFunctions.lgamma, (0, 1000)), - (SpecialFunctions.gamma, (0, 36)) + (acos, (-1, 1)), + (asin, (-1, 1)), + (atan, (-50, 50)), + (cos, (-1000, 1000)), + (sin, (-1000, 1000)), + (tan, (-1000, 1000)), + (acosh, (1, 1000)), + (asinh, (-1000, 1000)), + (atanh, (-1, 1)), + (cosh, (0, 89.415985f0)), + (sinh, (-89.415985f0, 89.415985f0)), + (tanh, (-8.66434f0, 8.66434f0)), + (cbrt, (-1000, 1000)), + (sqrt, (0, 1000)), + (exp, (-88.72284f0, 88.72284f0)), + (expm1, (-88.72284f0, 88.72284f0)), + (log, (0, 1000)), + (log10, (0, 1000)), + (log1p, (-1, 1000)), + (abs, (-1000, 1000)), + (abs2, (-1000, 1000)), + (ceil, (-1000, 1000)), + (floor, (-1000, 1000)), + (round, (-1000, 1000)), + (trunc, (-1000, 1000)), + (erf, (-3.8325067f0, 3.8325067f0)), + (erfc, (-3.7439213f0, 10.019834f0)), + (erfinv, (-1, 1)), + (erfcinv, (0, 2)), + (lgamma, (0, 1000)), + (gamma, (0, 36)) ) const base_binary_real = ( - (Base.atan, (-1, 1), (-1, 1)), - (Base.hypot, (-1000, 1000), (-1000, 1000)), + (atan, (-1, 1), (-1, 1)), + (hypot, (-1000, 1000), (-1000, 1000)), # (getfield(Base, :./), (-1000, 1000), (-1000, 1000)), # (getfield(Base, :.^), (0, 100), (-5, 20)) ) const base_unary_complex = ( - (Base.acos, (-1, 1)), - (Base.asin, (-1, 1)), - # (Base.atan, (-50, 50)), - # (Base.cos, (-10, 10)), - # (Base.sin, (-10, 10)), - # (Base.tan, (-10, 10)), - (Base.acosh, (1, 1000)), - (Base.asinh, (-1000, 1000)), - # (Base.atanh, (-1, 1)), - # (Base.cosh, (0, 89.415985f0)), - # (Base.sinh, (-89.415985f0, 89.415985f0)), - # (Base.tanh, (-8.66434f0, 8.66434f0)), - (Base.sqrt, (0, 1000)), - (Base.exp, (-88.72284f0, 88.72284f0)), - (Base.log, (0, 1000)), - # (Base.log10, (0, 1000)), - (Base.abs, (-1000, 1000)), - (Base.angle, (-1000, 1000)), - (Base.conj, (-1000, 1000)), - # (Base.cis, (-1000, 1000)) + (acos, (-1, 1)), + (asin, (-1, 1)), + # (atan, (-50, 50)), + # (cos, (-10, 10)), + # (sin, (-10, 10)), + # (tan, (-10, 10)), + (acosh, (1, 1000)), + (asinh, (-1000, 1000)), + # (atanh, (-1, 1)), + # (cosh, (0, 89.415985f0)), + # (sinh, (-89.415985f0, 89.415985f0)), + # (tanh, (-8.66434f0, 8.66434f0)), + (sqrt, (0, 1000)), + (exp, (-88.72284f0, 88.72284f0)), + (log, (0, 1000)), + # (log10, (0, 1000)), + (abs, (-1000, 1000)), + (angle, (-1000, 1000)), + (conj, (-1000, 1000)), + # (cis, (-1000, 1000)) ) # const base_binary_complex = ( # # (getfield(Base, :./), (-1000, 1000), (-1000, 1000)), -# # (Base.(:.^), (0, 100), (-2, 10)) +# # ((:.^), (0, 100), (-2, 10)) # ) function randindomain(t::Type{T}, n, domain) where {T<:Real} From 647862a6751edf74cf602fbd5be859d7b714dccd Mon Sep 17 00:00:00 2001 From: Michael Abbott Date: Wed, 13 Nov 2019 20:16:38 +0100 Subject: [PATCH 15/29] tests pass --- test/complex.jl | 28 ++++++++++++++++++++-------- test/real.jl | 32 ++++++++++++++++++++++---------- 2 files changed, 42 insertions(+), 18 deletions(-) diff --git a/test/complex.jl b/test/complex.jl index 365b78d..6d234c1 100644 --- a/test/complex.jl +++ b/test/complex.jl @@ -1,18 +1,30 @@ # First generate some random data and test functions in Base on it const NVALS = 1000 -input = Dict(t=>[(randindomain(t, NVALS, domain),) for (_, domain) in base_unary_complex] - for t in (ComplexF32, ComplexF64)) + +input = Dict( + t=>[ (randindomain(t, NVALS, domain),) for (_, domain) in base_unary_complex ] + for t in (ComplexF32, ComplexF64) +) + fns = [x[1] for x in base_unary_complex] -output = Dict(t=>[fns[i](input[t][i]...) for i = 1:length(fns)] - for t in (ComplexF32, ComplexF64)) + +# output = Dict( +# t=>[ fns[i](input[t][i]...) for i = 1:length(fns) ] +# for t in (ComplexF32, ComplexF64) +# ) @testset "Definitions and Comparison with Base for Complex" begin for t in (ComplexF32, ComplexF64), i = 1:length(fns) - fn = fns[i] - Test.@test which(fn, typeof(input[t][i])).module == VML + + base_fn = fns[i] + vml_fn = eval(:(VML.$(Symbol(base_fn)))) + + Test.@test which(vml_fn, typeof(input[t][i])).module == VML + # Test.test_approx_eq(output[t][i], fn(input[t][i]...), "Base $t $fn", "VML $t $fn") - Test.@test fn(input[t][i]...) ≈ fn.(input[t][i]...) + Test.@test vml_fn(input[t][i]...) ≈ base_fn.(input[t][i]...) + end -end \ No newline at end of file +end diff --git a/test/real.jl b/test/real.jl index dbe3a1d..f660f69 100644 --- a/test/real.jl +++ b/test/real.jl @@ -1,21 +1,31 @@ # First generate some random data and test functions in Base on it const NVALS = 1000 -input = Dict(t=>[[(randindomain(t, NVALS, domain),) for (_, domain) in base_unary_real]; - [(randindomain(t, NVALS, domain1), randindomain(t, NVALS, domain2)) - for (_, domain1, domain2) in base_binary_real]] - for t in (Float32, Float64)) + +input = Dict( + t=>[ + [ (randindomain(t, NVALS, domain),) for (_, domain) in base_unary_real ]; + [ (randindomain(t, NVALS, domain1), randindomain(t, NVALS, domain2)) + for (_, domain1, domain2) in base_binary_real ] + ] + for t in (Float32, Float64) +) + fns = [[x[1] for x in base_unary_real]; [x[1] for x in base_binary_real]] -# output = Dict(t=>[fns[i](input[t][i]...) for i = 1:length(fns)] for t in (Float32, Float64)) +# output = Dict(t=>[fns[i](input[t][i]...) for i = 1:length(fns)] for t in (Float32, Float64)) @testset "Definitions and Comparison with Base for Reals" begin for t in (Float32, Float64), i = 1:length(fns) - - fn = fns[i] - Test.@test which(fn, typeof(input[t][i])).module == VML + + base_fn = fns[i] + vml_fn = eval(:(VML.$(Symbol(base_fn)))) + + Test.@test which(vml_fn, typeof(input[t][i])).module == VML + # Test.test_approx_eq(output[t][i], fn(input[t][i]...), "Base $t $fn", "VML $t $fn") - Test.@test fn(input[t][i]...) ≈ fn.(input[t][i]...) + Test.@test vml_fn(input[t][i]...) ≈ base_fn.(input[t][i]...) + end end @@ -23,11 +33,13 @@ end @testset "Error Handling and Settings" begin # Verify that we still throw DomainErrors - Test.@test_throws DomainError sqrt([-1.0]) + Test.@test_throws DomainError VML.sqrt([-1.0]) + Test.@test_throws DomainError VML.log([-1.0]) # Setting accuracy vml_set_accuracy(VML_LA) Test.@test vml_get_accuracy() == VML_LA + vml_set_accuracy(VML_EP) Test.@test vml_get_accuracy() == VML_EP From 57678133ac352c41aef9e06efe0bc740e42bd964 Mon Sep 17 00:00:00 2001 From: Michael Abbott Date: Wed, 13 Nov 2019 20:30:12 +0100 Subject: [PATCH 16/29] tests for overload macro --- test/real.jl | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/test/real.jl b/test/real.jl index f660f69..780de4a 100644 --- a/test/real.jl +++ b/test/real.jl @@ -44,3 +44,16 @@ end Test.@test vml_get_accuracy() == VML_EP end + +@testset "@overload macro" begin + + @test VML.exp([1.0]) ≈ exp.([1.0]) + @test_throws MethodError Base.exp([1.0]) + @test (@overload log exp) isa String + @test Base.exp([1.0]) ≈ exp.([1.0]) + + @test_throws MethodError Base.atan([1.0], [2.0]) + @test (@overload atan) isa String + @test Base.atan([1.0], [2.0]) ≈ atan.([1.0], [2.0]) + +end From b00b360ba77788088b79c338a28d4d0685486aae Mon Sep 17 00:00:00 2001 From: Michael Abbott Date: Thu, 21 Nov 2019 00:18:43 +0100 Subject: [PATCH 17/29] docstring about matrix exp --- src/VML.jl | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/VML.jl b/src/VML.jl index 725ea0e..a5e1821 100644 --- a/src/VML.jl +++ b/src/VML.jl @@ -103,8 +103,11 @@ end """ @overload exp log sin -This macro adds a method to each function, so that when acting on an array -(or two arrays) it calls the `VML` version. The existing action on scalars is unaffected. +This macro adds a method to each function in `Base` (or perhaps in `SpecialFunctions`), +so that when acting on an array (or two arrays) it calls the `VML` function of the same name. + +The existing action on scalars is unaffected. However, `exp(M::Matrix)` will now mean +element-wise `VML.exp(M) == exp.(M)` rather then matrix exponentiation. """ macro overload(funs...) out = quote end From b09949bfa64091c9fb908974c7576109c5f273b5 Mon Sep 17 00:00:00 2001 From: Michael Abbott <32575566+mcabbott@users.noreply.github.com> Date: Thu, 21 Nov 2019 00:48:23 +0100 Subject: [PATCH 18/29] spelling --- src/VML.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/VML.jl b/src/VML.jl index a5e1821..0c9949f 100644 --- a/src/VML.jl +++ b/src/VML.jl @@ -107,7 +107,7 @@ This macro adds a method to each function in `Base` (or perhaps in `SpecialFunct so that when acting on an array (or two arrays) it calls the `VML` function of the same name. The existing action on scalars is unaffected. However, `exp(M::Matrix)` will now mean -element-wise `VML.exp(M) == exp.(M)` rather then matrix exponentiation. +element-wise `VML.exp(M) == exp.(M)`, rather than matrix exponentiation. """ macro overload(funs...) out = quote end From 828eafc71a216c9a41366ec751f42286618e0899 Mon Sep 17 00:00:00 2001 From: Steffen Date: Thu, 21 Nov 2019 01:58:57 +0000 Subject: [PATCH 19/29] Alternative solution, that should actually work --- deps/build.jl | 16 ---------------- src/VML.jl | 2 -- src/setup.jl | 8 +++++--- 3 files changed, 5 insertions(+), 21 deletions(-) diff --git a/deps/build.jl b/deps/build.jl index 067ad95..1d48fdd 100644 --- a/deps/build.jl +++ b/deps/build.jl @@ -12,21 +12,11 @@ else println("AVX2 support missing, vml_avx selected") end -addlibpath = false - if Sys.iswindows() rtlib = :mkl_rt corelib = :mkl_core lib = Symbol(:mkl_vml_, libsuffix) else - try - using MKL - mklpath = Base.pathof(MKL) - libpath = normpath(joinpath(dirname(mklpath), "../deps/usr/lib")) - addlibpath = true - catch - println("MKL.jl not found") - end rtlib = :libmkl_rt corelib = :libmkl_core lib = Symbol(:libmkl_vml_, libsuffix) @@ -43,11 +33,5 @@ open(depsjl_path, "w") do depsjl_file const lib = :$lib const rtlib = :$rtlib const corelib = :$corelib - const addlibpath = :$addlibpath - """)) - if addlibpath - println(depsjl_file, strip(""" - const libpath = :$libpath """)) - end end diff --git a/src/VML.jl b/src/VML.jl index e13036c..dcf1867 100644 --- a/src/VML.jl +++ b/src/VML.jl @@ -5,8 +5,6 @@ module VML # import Base: .^, ./ using SpecialFunctions using Libdl -# TODO detect CPU architecture -# include("libdetect.jl") include(joinpath(dirname(@__DIR__), "deps/deps.jl")) include("setup.jl") diff --git a/src/setup.jl b/src/setup.jl index 0912d4e..ded4f51 100644 --- a/src/setup.jl +++ b/src/setup.jl @@ -1,11 +1,13 @@ function __init__() + for mklpath in [Base.find_package("MKL")] + libpath = normpath(joinpath(dirname(mklpath), "../deps/usr/lib")) + push!(Libdl.DL_LOAD_PATH, libpath) + end + Libdl.dlopen(rtlib, RTLD_GLOBAL) Libdl.dlopen(corelib, RTLD_GLOBAL) # maybe only needed on mac Libdl.dlopen(lib, RTLD_GLOBAL) - if addlibpath - push!(Libdl.DL_LOAD_PATH, libpath) - end end __init__() From 6b2b85a4ae05fe69a2fe5d334bd53f4eab1ebe8a Mon Sep 17 00:00:00 2001 From: Steffen Date: Thu, 21 Nov 2019 02:24:43 +0000 Subject: [PATCH 20/29] Made MKL detection more robust --- src/setup.jl | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/setup.jl b/src/setup.jl index 08ad447..6b86624 100644 --- a/src/setup.jl +++ b/src/setup.jl @@ -1,6 +1,7 @@ function __init__() - for mklpath in [Base.find_package("MKL")] + MKLpkgid = Base.PkgId(Base.UUID("33e6dc65-8f57-5167-99aa-e5a354878fb2"), "MKL") + for mklpath in [Base.locate_package(MKLpkgid)] libpath = normpath(joinpath(dirname(mklpath), "../deps/usr/lib")) push!(Libdl.DL_LOAD_PATH, libpath) end From 51ea8fb74948c5e6bc4e188aef0800807e1c1570 Mon Sep 17 00:00:00 2001 From: Steffen Date: Thu, 21 Nov 2019 03:09:55 +0000 Subject: [PATCH 21/29] Updated readme --- README.md | 92 ++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 70 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index 9caafd7..bb35159 100644 --- a/README.md +++ b/README.md @@ -3,23 +3,56 @@ This package provides bindings to the Intel Vector Math Library for arithmetic and transcendental functions. Especially for large vectors it is often substantially faster than broadcasting Julia's built-in functions. -## Setting up VML.jl - -To use VML.jl, you must have the Intel Vector Math Library installed. -For this you have two options. First, you can install (and build) [MKL.jl](https://github.com/JuliaComputing/MKL.jl), which will add the necessary libraries to your Julia install. This will change your Julia system image however, so if you would prefer not to do that you can get the stand-alone [MKL](http://software.intel.com/en-us/intel-mkl), -which is free for non-commercial use. - -Libdl automatically finds the relevant libraries in the default search locations. This already the case if you use MKL.jl, but the stand-alone may require you to source `mklvars.sh`. The default command on Mac and Ubuntu is `source /opt/intel/mkl/bin/mklvars.sh intel64`. You may want to add this to your `.bashrc`. -Adding a new `*.conf` file in `/etc/ld.so.conf.d` also works, as the `intel-mkl-slim` package in the AUR does automatically. - -Using [CpuId.jl](https://github.com/m-j-w/CpuId.jl), VML.jl detects if your processor supports the newer `avx2` instructions, and if not default to `libmkl_vml_avx`. If your system does not have AVX this package will currently not work for you. - -If the CPU feature detection does not work for you, please open an issue. - -## Using VML.jl - -After loading VML.jl, vector calls to functions listed below will -automatically use VML instead of openlibm when possible. Note that most function currently do not have a vectorized version (e.g. you call `sin.(rand(300))`), so there should be no conflict. If there is let me know. Updated and conflict tested exported functions are planned for the future. +## Basic install + +To use VML.jl, you must have the shared libraries of the Intel Vector Math Library avilable on your system. +The easiest option is to use [MKL.jl](https://github.com/JuliaComputing/MKL.jl) via +``` +julia> ] add https://github.com/JuliaComputing/MKL.jl.git +``` +Alternatively you can install MKL directly [from intel](https://software.intel.com/en-us/mkl/choose-download). + +Note that intel MKL has a separate license, which you may want to check for commercial projects (see [FAQ]( https://software.intel.com/en-us/mkl/license-faq)). + +To install VML.jl run +``` +julia> ] add https://github.com/Crown421/VML.jl +``` + +## Using VML +After loading `VML`, you have the supported function listed below available to call, i.e. `VML.sin(rand(100))`. This should provide a significant speed-up over broadcasting the Base functions. +``` +julia> using VML +julia> a = rand(10000); +julia>@time sin.(a); +0.159878 seconds (583.25 k allocations: 30.720 MiB, 2.78% gc time) +julia> @time VML.sin(a); +0.000465 seconds (6 allocations: 781.484 KiB) +``` + +Most function do currently (julia 1.x) not have a vectorized form, meaning that i.e. `sin(rand(10))` will not work. If you would like to extend the Base function with this functionality you can overload them with the `@overload` macro: +``` +julia> @overload sin +julia> @time sin(a); +0.000485 seconds (6 allocations: 781.484 KiB) +``` +Note the lack of the broadcasting dot`.` Now calling i.e. `sin` with an array as input will call the VML functions. + +#### Note: +Some functions like `exp` and `log` do operate on matrices from Base and refer to the [matrix exponential](https://en.wikipedia.org/wiki/Matrix_exponential) and logarithm. Using `@overload exp` will overwrite this behaviour with element-wise exponentiation/ logarithm. +``` +julia> exp([1 1; 1 1.0]) +2×2 Array{Float64,2}: + 4.19453 3.19453 + 3.19453 4.19453 + +julia> VML.exp([1 1; 1 1.0]) +2×2 Array{Float64,2}: + 2.71828 2.71828 + 2.71828 2.71828 +``` + +### Accuracy By default, VML uses `VML_HA` mode, which corresponds to an accuracy of <1 ulp, matching the accuracy of Julia's built-in openlibm @@ -43,9 +76,8 @@ VML use only a single core when performing these benchmarks. ## Supported functions -VML.jl supports the following functions, currently for Float32 and -Float64 only. While VML also offers operators for complex numbers, -these are not yet implemented in VML.jl. +VML.jl supports the following functions, most for Float32 and +Float64, while some also take complex numbers. ### Unary functions @@ -102,5 +134,21 @@ Allocating | Mutating `divide` | `divide!` -### Next steps -Next steps for this package are proper Windows support, writing up proper testing to make sure each advertised function actually works as expected and build testing on travis. +## Next steps +Next steps for this package +* [x] Windows support +* [x] Basic Testing +* [x] Avoiding overloading base and optional overload function +* [ ] Updating Benchmarks +* [ ] Testing Travis +* [ ] Adding CIS function + + + +## Advanced +VML.jl works via Libdl which loads the relevant shared libraries. Libdl automatically finds the relevant libraries if the location of the binaries has been added to the system search paths. +This already taken care of if you use MKL.jl, but the stand-alone may require you to source `mklvars.sh`. The default command on Mac and Ubuntu is `source /opt/intel/mkl/bin/mklvars.sh intel64`. You may want to add this to your `.bashrc`. +Adding a new `*.conf` file in `/etc/ld.so.conf.d` also works, as the `intel-mkl-slim` package in the AUR does automatically. + +Further, VML.jl uses [CpuId.jl](https://github.com/m-j-w/CpuId.jl) to detect if your processor supports the newer `avx2` instructions, and if not defaults to `libmkl_vml_avx`. If your system does not have AVX this package will currently not work for you. +If the CPU feature detection does not work for you, please open an issue. From 240d96a862a78e2c2a8e1739de1a75cf4f0e6caf Mon Sep 17 00:00:00 2001 From: Steffen Date: Thu, 21 Nov 2019 04:01:05 +0000 Subject: [PATCH 22/29] Added test dependency and modified tests --- Project.toml | 3 +- test/common.jl | 86 ++++++++++++++++++++++++------------------------- test/complex.jl | 8 ++--- test/real.jl | 10 +++--- 4 files changed, 54 insertions(+), 53 deletions(-) diff --git a/Project.toml b/Project.toml index 8e73420..377f5bd 100644 --- a/Project.toml +++ b/Project.toml @@ -11,6 +11,7 @@ julia = "≥ 0.7 1.0" [extras] Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" +MKL = "33e6dc65-8f57-5167-99aa-e5a354878fb2" [targets] -test = ["Test"] +test = ["Test", "MKL"] diff --git a/test/common.jl b/test/common.jl index 4bc9c94..2e93695 100644 --- a/test/common.jl +++ b/test/common.jl @@ -1,65 +1,65 @@ using SpecialFunctions const base_unary_real = ( - (acos, (-1, 1)), - (asin, (-1, 1)), - (atan, (-50, 50)), - (cos, (-1000, 1000)), - (sin, (-1000, 1000)), - (tan, (-1000, 1000)), - (acosh, (1, 1000)), - (asinh, (-1000, 1000)), - (atanh, (-1, 1)), - (cosh, (0, 89.415985f0)), - (sinh, (-89.415985f0, 89.415985f0)), - (tanh, (-8.66434f0, 8.66434f0)), - (cbrt, (-1000, 1000)), - (sqrt, (0, 1000)), - (exp, (-88.72284f0, 88.72284f0)), - (expm1, (-88.72284f0, 88.72284f0)), - (log, (0, 1000)), - (log10, (0, 1000)), - (log1p, (-1, 1000)), - (abs, (-1000, 1000)), - (abs2, (-1000, 1000)), - (ceil, (-1000, 1000)), - (floor, (-1000, 1000)), - (round, (-1000, 1000)), - (trunc, (-1000, 1000)), - (erf, (-3.8325067f0, 3.8325067f0)), - (erfc, (-3.7439213f0, 10.019834f0)), - (erfinv, (-1, 1)), - (erfcinv, (0, 2)), - (lgamma, (0, 1000)), - (gamma, (0, 36)) + (:Base, :acos, (-1, 1)), + (:Base, :asin, (-1, 1)), + (:Base, :atan, (-50, 50)), + (:Base, :cos, (-1000, 1000)), + (:Base, :sin, (-1000, 1000)), + (:Base, :tan, (-1000, 1000)), + (:Base, :acosh, (1, 1000)), + (:Base, :asinh, (-1000, 1000)), + (:Base, :atanh, (-1, 1)), + (:Base, :cosh, (0, 89.415985f0)), + (:Base, :sinh, (-89.415985f0, 89.415985f0)), + (:Base, :tanh, (-8.66434f0, 8.66434f0)), + (:Base, :cbrt, (-1000, 1000)), + (:Base, :sqrt, (0, 1000)), + (:Base, :exp, (-88.72284f0, 88.72284f0)), + (:Base, :expm1, (-88.72284f0, 88.72284f0)), + (:Base, :log, (0, 1000)), + (:Base, :log10, (0, 1000)), + (:Base, :log1p, (-1, 1000)), + (:Base, :abs, (-1000, 1000)), + (:Base, :abs2, (-1000, 1000)), + (:Base, :ceil, (-1000, 1000)), + (:Base, :floor, (-1000, 1000)), + (:Base, :round, (-1000, 1000)), + (:Base, :trunc, (-1000, 1000)), + (:SpecialFunctions, :erf, (-3.8325067f0, 3.8325067f0)), + (:SpecialFunctions, :erfc, (-3.7439213f0, 10.019834f0)), + (:SpecialFunctions, :erfinv, (-1, 1)), + (:SpecialFunctions, :erfcinv, (0, 2)), + (:SpecialFunctions, :lgamma, (0, 1000)), + (:SpecialFunctions, :gamma, (0, 36)) ) const base_binary_real = ( - (atan, (-1, 1), (-1, 1)), - (hypot, (-1000, 1000), (-1000, 1000)), + (:Base, :atan, (-1, 1), (-1, 1)), + (:Base, :hypot, (-1000, 1000), (-1000, 1000)), # (getfield(Base, :./), (-1000, 1000), (-1000, 1000)), # (getfield(Base, :.^), (0, 100), (-5, 20)) ) const base_unary_complex = ( - (acos, (-1, 1)), - (asin, (-1, 1)), + (:Base, :acos, (-1, 1)), + (:Base, :asin, (-1, 1)), + (:Base, :acosh, (1, 1000)), + (:Base, :asinh, (-1000, 1000)), + (:Base, :sqrt, (0, 1000)), + (:Base, :exp, (-88.72284f0, 88.72284f0)), + (:Base, :log, (0, 1000)), + (:Base, :abs, (-1000, 1000)), + (:Base, :angle, (-1000, 1000)), + (:Base, :conj, (-1000, 1000)), # (atan, (-50, 50)), # (cos, (-10, 10)), # (sin, (-10, 10)), # (tan, (-10, 10)), - (acosh, (1, 1000)), - (asinh, (-1000, 1000)), # (atanh, (-1, 1)), # (cosh, (0, 89.415985f0)), # (sinh, (-89.415985f0, 89.415985f0)), # (tanh, (-8.66434f0, 8.66434f0)), - (sqrt, (0, 1000)), - (exp, (-88.72284f0, 88.72284f0)), - (log, (0, 1000)), # (log10, (0, 1000)), - (abs, (-1000, 1000)), - (angle, (-1000, 1000)), - (conj, (-1000, 1000)), # (cis, (-1000, 1000)) ) diff --git a/test/complex.jl b/test/complex.jl index 6d234c1..b5b1183 100644 --- a/test/complex.jl +++ b/test/complex.jl @@ -2,11 +2,11 @@ const NVALS = 1000 input = Dict( - t=>[ (randindomain(t, NVALS, domain),) for (_, domain) in base_unary_complex ] + t=>[ (randindomain(t, NVALS, domain),) for (_, _, domain) in base_unary_complex ] for t in (ComplexF32, ComplexF64) ) -fns = [x[1] for x in base_unary_complex] +fns = [x[1:2] for x in base_unary_complex] # output = Dict( # t=>[ fns[i](input[t][i]...) for i = 1:length(fns) ] @@ -17,8 +17,8 @@ fns = [x[1] for x in base_unary_complex] for t in (ComplexF32, ComplexF64), i = 1:length(fns) - base_fn = fns[i] - vml_fn = eval(:(VML.$(Symbol(base_fn)))) + base_fn = eval(:($(fns[i][1]).$(fns[i][2]))) + vml_fn = eval(:(VML.$(fns[i][2]))) Test.@test which(vml_fn, typeof(input[t][i])).module == VML diff --git a/test/real.jl b/test/real.jl index 780de4a..ad773ff 100644 --- a/test/real.jl +++ b/test/real.jl @@ -3,14 +3,14 @@ const NVALS = 1000 input = Dict( t=>[ - [ (randindomain(t, NVALS, domain),) for (_, domain) in base_unary_real ]; + [ (randindomain(t, NVALS, domain),) for (_, _, domain) in base_unary_real ]; [ (randindomain(t, NVALS, domain1), randindomain(t, NVALS, domain2)) - for (_, domain1, domain2) in base_binary_real ] + for (_, _, domain1, domain2) in base_binary_real ] ] for t in (Float32, Float64) ) -fns = [[x[1] for x in base_unary_real]; [x[1] for x in base_binary_real]] +fns = [[x[1:2] for x in base_unary_real]; [x[1:2] for x in base_binary_real]] # output = Dict(t=>[fns[i](input[t][i]...) for i = 1:length(fns)] for t in (Float32, Float64)) @@ -18,8 +18,8 @@ fns = [[x[1] for x in base_unary_real]; [x[1] for x in base_binary_real]] for t in (Float32, Float64), i = 1:length(fns) - base_fn = fns[i] - vml_fn = eval(:(VML.$(Symbol(base_fn)))) + base_fn = eval(:($(fns[i][1]).$(fns[i][2]))) + vml_fn = eval(:(VML.$(fns[i][2]))) Test.@test which(vml_fn, typeof(input[t][i])).module == VML From 06589c1a31465a119d641761e941699aacf00ad8 Mon Sep 17 00:00:00 2001 From: Steffen Date: Thu, 21 Nov 2019 13:11:36 +0000 Subject: [PATCH 23/29] First travis file Adding MKL to before_script Avoiding double build of MKL Try again to avoid double build Try again to avoid double build 2 Maybe with a Manifest Test specific environment Add MKL again Basically final final --- .travis.yml | 24 +++++++ README.md | 3 +- test/Manifest.toml | 174 +++++++++++++++++++++++++++++++++++++++++++++ test/Project.toml | 6 ++ 4 files changed, 206 insertions(+), 1 deletion(-) create mode 100644 .travis.yml create mode 100644 test/Manifest.toml create mode 100644 test/Project.toml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..127109b --- /dev/null +++ b/.travis.yml @@ -0,0 +1,24 @@ +language: julia + +os: + - linux + - osx + +julia: + - 1.0 + - nightly + +before_script: + # Every 30 seconds, look for the build log file. If it exists, then + # start watching its contents and printing them to stdout as they + # change. This has two effects: + # 1. it avoids Travis timing out because the build outputs nothing + # 2. it makes it more obvious what part of the build, if any, gets stuck + # - while sleep 30; do tail ./deps/build.log -f ; done & + - julia --project --color=yes --check-bounds=yes -e 'using Pkg; Pkg.add(PackageSpec(url="https://github.com/JuliaComputing/MKL.jl"));' + +script: + # + - export JL_PKG=VML + - julia --color=yes -e "if VERSION < v\"0.7.0-DEV.5183\"; Pkg.clone(pwd()); Pkg.build(\"VML\"); else using Pkg; if VERSION >= v\"1.1.0-rc1\"; Pkg.build(\"VML\"; verbose=true); else Pkg.build(\"VML\"); end; end" + - julia --check-bounds=yes --color=yes -e "if VERSION < v\"0.7.0-DEV.5183\"; Pkg.test(\"VML\", coverage=true); else using Pkg; Pkg.test(coverage=true); end" \ No newline at end of file diff --git a/README.md b/README.md index bb35159..cfb99b5 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ -# VML +# VML +[![Build Status](https://travis-ci.com/Crown421/VML.jl.svg?branch=master)](https://travis-ci.com/Crown421/VML.jl) This package provides bindings to the Intel Vector Math Library for arithmetic and transcendental functions. Especially for large vectors it is often substantially faster than broadcasting Julia's built-in functions. diff --git a/test/Manifest.toml b/test/Manifest.toml new file mode 100644 index 0000000..636077b --- /dev/null +++ b/test/Manifest.toml @@ -0,0 +1,174 @@ +# This file is machine-generated - editing it directly is not advised + +[[Base64]] +uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" + +[[BinDeps]] +deps = ["Compat", "Libdl", "SHA", "URIParser"] +git-tree-sha1 = "12093ca6cdd0ee547c39b1870e0c9c3f154d9ca9" +uuid = "9e28174c-4ba2-5203-b857-d8d62c4213ee" +version = "0.8.10" + +[[BinaryProvider]] +deps = ["Libdl", "SHA"] +git-tree-sha1 = "5b08ed6036d9d3f0ee6369410b830f8873d4024c" +uuid = "b99e7846-7c00-51b0-8f62-c81ae34c0232" +version = "0.5.8" + +[[BufferedStreams]] +deps = ["Compat", "Test"] +git-tree-sha1 = "5d55b9486590fdda5905c275bb21ce1f0754020f" +uuid = "e1450e63-4bb3-523b-b2a4-4ffa8c0fd77d" +version = "1.0.0" + +[[Compat]] +deps = ["Base64", "Dates", "DelimitedFiles", "Distributed", "InteractiveUtils", "LibGit2", "Libdl", "LinearAlgebra", "Markdown", "Mmap", "Pkg", "Printf", "REPL", "Random", "Serialization", "SharedArrays", "Sockets", "SparseArrays", "Statistics", "Test", "UUIDs", "Unicode"] +git-tree-sha1 = "ed2c4abadf84c53d9e58510b5fc48912c2336fbb" +uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" +version = "2.2.0" + +[[CpuId]] +deps = ["Markdown", "Test"] +git-tree-sha1 = "f0464e499ab9973b43c20f8216d088b61fda80c6" +uuid = "adafc99b-e345-5852-983c-f28acb93d879" +version = "0.2.2" + +[[Dates]] +deps = ["Printf"] +uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" + +[[DelimitedFiles]] +deps = ["Mmap"] +uuid = "8bb1440f-4735-579b-a4ab-409b98df4dab" + +[[Distributed]] +deps = ["Random", "Serialization", "Sockets"] +uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" + +[[HTTPClient]] +deps = ["Compat", "LibCURL"] +git-tree-sha1 = "161d5776ae8e585ac0b8c20fb81f17ab755b3671" +uuid = "0862f596-cf2d-50af-8ef4-f2be67dfa83f" +version = "0.2.1" + +[[InteractiveUtils]] +deps = ["Markdown"] +uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" + +[[LibCURL]] +deps = ["BinaryProvider", "Libdl"] +git-tree-sha1 = "fd5fc15f2a04608fe1435a769dbbfc7959ff1daa" +uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" +version = "0.5.2" + +[[LibExpat]] +deps = ["Compat"] +git-tree-sha1 = "fde352ec13479e2f90e57939da2440fb78c5e388" +uuid = "522f3ed2-3f36-55e3-b6df-e94fee9b0c07" +version = "0.5.0" + +[[LibGit2]] +uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" + +[[Libdl]] +uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" + +[[Libz]] +deps = ["BufferedStreams", "Random", "Test"] +git-tree-sha1 = "d405194ffc0293c3519d4f7251ce51baac9cc871" +uuid = "2ec943e9-cfe8-584d-b93d-64dcb6d567b7" +version = "1.0.0" + +[[LinearAlgebra]] +deps = ["Libdl"] +uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + +[[Logging]] +uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" + +[[MKL]] +deps = ["BinaryProvider", "Libdl", "LinearAlgebra", "PackageCompiler", "Test"] +git-tree-sha1 = "22e1063dfa595b24956d7b364c33a4f45e70e247" +repo-rev = "master" +repo-url = "https://github.com/JuliaComputing/MKL.jl.git" +uuid = "33e6dc65-8f57-5167-99aa-e5a354878fb2" +version = "0.0.0" + +[[Markdown]] +deps = ["Base64"] +uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" + +[[Mmap]] +uuid = "a63ad114-7e13-5084-954f-fe012c677804" + +[[PackageCompiler]] +deps = ["Libdl", "Pkg", "REPL", "Serialization", "UUIDs", "WinRPM"] +git-tree-sha1 = "0b5dccd6520dd7072d1d2a7fb22501a98f42e691" +uuid = "9b87118b-4619-50d2-8e1e-99f35a4d4d9d" +version = "0.6.4" + +[[Pkg]] +deps = ["Dates", "LibGit2", "Markdown", "Printf", "REPL", "Random", "SHA", "UUIDs"] +uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" + +[[Printf]] +deps = ["Unicode"] +uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" + +[[REPL]] +deps = ["InteractiveUtils", "Markdown", "Sockets"] +uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" + +[[Random]] +deps = ["Serialization"] +uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" + +[[SHA]] +uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" + +[[Serialization]] +uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" + +[[SharedArrays]] +deps = ["Distributed", "Mmap", "Random", "Serialization"] +uuid = "1a1011a3-84de-559e-8e89-a11a2f7dc383" + +[[Sockets]] +uuid = "6462fe0b-24de-5631-8697-dd941f90decc" + +[[SparseArrays]] +deps = ["LinearAlgebra", "Random"] +uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + +[[SpecialFunctions]] +deps = ["BinDeps", "BinaryProvider", "Libdl"] +git-tree-sha1 = "3bdd374b6fd78faf0119b8c5d538788dbf910c6e" +uuid = "276daf66-3868-5448-9aa4-cd146d93841b" +version = "0.8.0" + +[[Statistics]] +deps = ["LinearAlgebra", "SparseArrays"] +uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" + +[[Test]] +deps = ["Distributed", "InteractiveUtils", "Logging", "Random"] +uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[[URIParser]] +deps = ["Test", "Unicode"] +git-tree-sha1 = "6ddf8244220dfda2f17539fa8c9de20d6c575b69" +uuid = "30578b45-9adc-5946-b283-645ec420af67" +version = "0.4.0" + +[[UUIDs]] +deps = ["Random", "SHA"] +uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" + +[[Unicode]] +uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" + +[[WinRPM]] +deps = ["BinDeps", "Compat", "HTTPClient", "LibExpat", "Libdl", "Libz", "URIParser"] +git-tree-sha1 = "2a889d320f3b77d17c037f295859fe570133cfbf" +uuid = "c17dfb99-b4f7-5aad-8812-456da1ad7187" +version = "0.4.2" diff --git a/test/Project.toml b/test/Project.toml new file mode 100644 index 0000000..f0407c7 --- /dev/null +++ b/test/Project.toml @@ -0,0 +1,6 @@ +[deps] +CpuId = "adafc99b-e345-5852-983c-f28acb93d879" +Libdl = "8f399da3-3557-5675-b5ff-fb832c97cbdb" +MKL = "33e6dc65-8f57-5167-99aa-e5a354878fb2" +SpecialFunctions = "276daf66-3868-5448-9aa4-cd146d93841b" +Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" From 4b5f6dd45b1f84cce66cecaff0d0942000c190d1 Mon Sep 17 00:00:00 2001 From: Steffen Date: Thu, 21 Nov 2019 20:03:44 +0000 Subject: [PATCH 24/29] Add AppVeyor and badges --- .travis.yml | 5 +++++ README.md | 1 + appveyor.yml | 45 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 51 insertions(+) create mode 100644 appveyor.yml diff --git a/.travis.yml b/.travis.yml index 127109b..934f97b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,6 +8,11 @@ julia: - 1.0 - nightly +branches: + only: + - master + - TravisTesting + before_script: # Every 30 seconds, look for the build log file. If it exists, then # start watching its contents and printing them to stdout as they diff --git a/README.md b/README.md index cfb99b5..04cc362 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@ # VML [![Build Status](https://travis-ci.com/Crown421/VML.jl.svg?branch=master)](https://travis-ci.com/Crown421/VML.jl) +[![Build status](https://ci.appveyor.com/api/projects/status/btdduqfsxux8fhsr?svg=true)](https://ci.appveyor.com/project/Crown421/vml-jl) This package provides bindings to the Intel Vector Math Library for arithmetic and transcendental functions. Especially for large vectors it is often substantially faster than broadcasting Julia's built-in functions. diff --git a/appveyor.yml b/appveyor.yml new file mode 100644 index 0000000..d8a05fe --- /dev/null +++ b/appveyor.yml @@ -0,0 +1,45 @@ + +environment: + matrix: + - julia_version: 1 + - julia_version: nightly + +platform: + # - x86 # 32-bit + - x64 # 64-bit + +# # Uncomment the following lines to allow failures on nightly julia +# # (tests will run but not make your overall status red) +matrix: + allow_failures: + - julia_version: nightly + +branches: + only: + - master + # - AppVeyor + +notifications: + - provider: Email + on_build_success: false + on_build_failure: false + on_build_status_changed: false + +install: + - ps: iex ((new-object net.webclient).DownloadString("https://raw.githubusercontent.com/JuliaCI/Appveyor.jl/version-1/bin/install.ps1")) + +build_script: + - C:\julia\bin\julia -e "using Pkg; Pkg.add(PackageSpec(url=\"https://github.com/JuliaComputing/MKL.jl\"));" + - echo "%JL_BUILD_SCRIPT%" + - C:\julia\bin\julia -e "%JL_BUILD_SCRIPT%" + +test_script: + - echo "%JL_TEST_SCRIPT%" + - C:\julia\bin\julia -e "%JL_TEST_SCRIPT%" + +# # Uncomment to support code coverage upload. Should only be enabled for packages +# # which would have coverage gaps without running on Windows +# on_success: +# - echo "%JL_CODECOV_SCRIPT%" +# - C:\julia\bin\julia -e "%JL_CODECOV_SCRIPT%" + From 4acb855da49c5781d5248e4547412cb9e58218e2 Mon Sep 17 00:00:00 2001 From: Steffen Date: Fri, 22 Nov 2019 00:14:26 +0000 Subject: [PATCH 25/29] Added cis --- src/VML.jl | 3 +++ src/setup.jl | 5 +++-- test/common.jl | 1 + 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/VML.jl b/src/VML.jl index 33eca18..c3bda05 100644 --- a/src/VML.jl +++ b/src/VML.jl @@ -88,6 +88,9 @@ for t in (Float32, Float64) def_unary_op(Complex{t}, t, :abs, :abs!, :Abs) def_unary_op(Complex{t}, t, :angle, :angle!, :Arg) + ### cis is special, vml function is based on output + def_unary_op(t, Complex{t}, :cis, :cis!, :CIS; vmltype = Complex{t}) + # Binary, complex-only. These are more accurate but performance is # either equivalent to Base or slower. # def_binary_op(Complex{t}, Complex{t}, (:+), :add!, :Add, false) diff --git a/src/setup.jl b/src/setup.jl index 6b86624..c7247bb 100644 --- a/src/setup.jl +++ b/src/setup.jl @@ -62,8 +62,9 @@ function vml_prefix(t::DataType) error("unknown type $t") end -function def_unary_op(tin, tout, jlname, jlname!, mklname) - mklfn = Base.Meta.quot(Symbol("$(vml_prefix(tin))$mklname")) +function def_unary_op(tin, tout, jlname, jlname!, mklname; + vmltype = tin) + mklfn = Base.Meta.quot(Symbol("$(vml_prefix(vmltype))$mklname")) exports = Symbol[] (@isdefined jlname) || push!(exports, jlname) (@isdefined jlname!) || push!(exports, jlname!) diff --git a/test/common.jl b/test/common.jl index 2e93695..de54dab 100644 --- a/test/common.jl +++ b/test/common.jl @@ -25,6 +25,7 @@ const base_unary_real = ( (:Base, :floor, (-1000, 1000)), (:Base, :round, (-1000, 1000)), (:Base, :trunc, (-1000, 1000)), + (:Base, :cis, (-1000, 1000)), (:SpecialFunctions, :erf, (-3.8325067f0, 3.8325067f0)), (:SpecialFunctions, :erfc, (-3.7439213f0, 10.019834f0)), (:SpecialFunctions, :erfinv, (-1, 1)), From 9b9bac93c7f36be7a70572a453f03ba98f985b14 Mon Sep 17 00:00:00 2001 From: Steffen Date: Fri, 22 Nov 2019 00:39:39 +0000 Subject: [PATCH 26/29] Update Readme, fix bug, user-friendly warning in init --- README.md | 5 +++-- src/VML.jl | 2 +- src/setup.jl | 10 +++++++--- test/real.jl | 1 + 4 files changed, 12 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 04cc362..876554a 100644 --- a/README.md +++ b/README.md @@ -142,8 +142,9 @@ Next steps for this package * [x] Basic Testing * [x] Avoiding overloading base and optional overload function * [ ] Updating Benchmarks -* [ ] Testing Travis -* [ ] Adding CIS function +* [x] Travis and AppVeyor testing +* [x] Adding CIS function +* [ ] Add tests for mutating functions diff --git a/src/VML.jl b/src/VML.jl index c3bda05..1200ee9 100644 --- a/src/VML.jl +++ b/src/VML.jl @@ -28,7 +28,7 @@ for t in (Float32, Float64) # Unary, real-only def_unary_op(t, t, :cbrt, :cbrt!, :Cbrt) def_unary_op(t, t, :expm1, :expm1!, :Expm1) - def_unary_op(t, t, :log1p, :log1p, :Log1p) + def_unary_op(t, t, :log1p, :log1p!, :Log1p) def_unary_op(t, t, :abs, :abs!, :Abs) def_unary_op(t, t, :abs2, :abs2!, :Sqr) def_unary_op(t, t, :ceil, :ceil!, :Ceil) diff --git a/src/setup.jl b/src/setup.jl index c7247bb..c09e7b9 100644 --- a/src/setup.jl +++ b/src/setup.jl @@ -6,9 +6,13 @@ function __init__() push!(Libdl.DL_LOAD_PATH, libpath) end - Libdl.dlopen(rtlib, RTLD_GLOBAL) - Libdl.dlopen(corelib, RTLD_GLOBAL) # maybe only needed on mac - Libdl.dlopen(lib, RTLD_GLOBAL) + if isempty(Libdl.find_library(:libmkl_rt)) + error("Could not find MKL shared libraries. Please add MKL.jl or install MKL via the intel website. See the github repository for more details.)") + else + Libdl.dlopen(rtlib, RTLD_GLOBAL) + Libdl.dlopen(corelib, RTLD_GLOBAL) # maybe only needed on mac + Libdl.dlopen(lib, RTLD_GLOBAL) + end end __init__() diff --git a/test/real.jl b/test/real.jl index ad773ff..20980a7 100644 --- a/test/real.jl +++ b/test/real.jl @@ -20,6 +20,7 @@ fns = [[x[1:2] for x in base_unary_real]; [x[1:2] for x in base_binary_real]] base_fn = eval(:($(fns[i][1]).$(fns[i][2]))) vml_fn = eval(:(VML.$(fns[i][2]))) + # vml_fn! = eval(:(VML.$(fns[i][2])!)) Test.@test which(vml_fn, typeof(input[t][i])).module == VML From 1a5450cd613f1c1da331789c2f386c0247d94614 Mon Sep 17 00:00:00 2001 From: Steffen Date: Fri, 22 Nov 2019 01:44:06 +0000 Subject: [PATCH 27/29] Fixed bug --- src/setup.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/setup.jl b/src/setup.jl index c09e7b9..2522950 100644 --- a/src/setup.jl +++ b/src/setup.jl @@ -6,7 +6,7 @@ function __init__() push!(Libdl.DL_LOAD_PATH, libpath) end - if isempty(Libdl.find_library(:libmkl_rt)) + if isempty(Libdl.find_library(rtlib)) error("Could not find MKL shared libraries. Please add MKL.jl or install MKL via the intel website. See the github repository for more details.)") else Libdl.dlopen(rtlib, RTLD_GLOBAL) From 009483696e0fe7645d752ac07b49f9b704446460 Mon Sep 17 00:00:00 2001 From: Steffen Date: Sun, 24 Nov 2019 14:28:04 +0000 Subject: [PATCH 28/29] Fixed loading from intel MKL without MKL.jl --- src/setup.jl | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/setup.jl b/src/setup.jl index 2522950..c201423 100644 --- a/src/setup.jl +++ b/src/setup.jl @@ -1,18 +1,18 @@ function __init__() MKLpkgid = Base.PkgId(Base.UUID("33e6dc65-8f57-5167-99aa-e5a354878fb2"), "MKL") - for mklpath in [Base.locate_package(MKLpkgid)] + mklpath = Base.locate_package(MKLpkgid) + if !isempty(mklpath) libpath = normpath(joinpath(dirname(mklpath), "../deps/usr/lib")) push!(Libdl.DL_LOAD_PATH, libpath) - end - - if isempty(Libdl.find_library(rtlib)) + elseif isempty(Libdl.find_library(rtlib)) error("Could not find MKL shared libraries. Please add MKL.jl or install MKL via the intel website. See the github repository for more details.)") - else - Libdl.dlopen(rtlib, RTLD_GLOBAL) - Libdl.dlopen(corelib, RTLD_GLOBAL) # maybe only needed on mac - Libdl.dlopen(lib, RTLD_GLOBAL) end + + Libdl.dlopen(rtlib, RTLD_GLOBAL) + Libdl.dlopen(corelib, RTLD_GLOBAL) # maybe only needed on mac + Libdl.dlopen(lib, RTLD_GLOBAL) + end __init__() From 16b0763d3461816963da67ba621277eb8fb2a558 Mon Sep 17 00:00:00 2001 From: Amin Yahyaabadi Date: Mon, 25 Nov 2019 15:15:19 -0600 Subject: [PATCH 29/29] Updating Benchmark (#2) * updating used deps * bench function update * ratioci function formatting * input changed to Dict and updated * fns updated * single bench call * Docstring for bench function * Using Dict for different types in benchmark * Formatting * Benchmarking progress print * using Dicts for calling function names * example for calling bench * bench call updated * type print in bench * Full working bench example * Plot function updated * Code movement * Saving benchmark data * DPI increase * Full test * more docstrings * changed variable size * Disabled error bar calculation * removing log10 and lgamma * correct hline legend * code for loading the data * Adding benchmark result * bug fix * Update performance.png * Fixed title and ylabel * cd to current file * Update image * git ignore jld2 --- benchmark/.gitignore | 1 + benchmark/benchmark.jl | 197 +++++++++++++++++++++++++------------- benchmark/performance.png | Bin 44392 -> 247140 bytes 3 files changed, 131 insertions(+), 67 deletions(-) create mode 100644 benchmark/.gitignore diff --git a/benchmark/.gitignore b/benchmark/.gitignore new file mode 100644 index 0000000..d390084 --- /dev/null +++ b/benchmark/.gitignore @@ -0,0 +1 @@ +*.jld2 diff --git a/benchmark/benchmark.jl b/benchmark/benchmark.jl index 49a2410..c91e7da 100644 --- a/benchmark/benchmark.jl +++ b/benchmark/benchmark.jl @@ -1,87 +1,150 @@ -using Distributions, PyCall, PyPlot -@pyimport matplotlib.gridspec as gridspec +using VML +using Distributions, Statistics, BenchmarkTools # for benchmark +using Plots # for plotting +using JLD2, FileIO # to save file +cd(dirname(@__FILE__)) include(joinpath(dirname(dirname(@__FILE__)), "test", "common.jl")) + +################################################################ complex = !isempty(ARGS) && ARGS[1] == "complex" +complex = false + +# First generate some random data and test functions in Base on it +const NVALS = 10_000 +base_unary = complex ? base_unary_complex : base_unary_real +base_binary = complex ? base_binary_complex : base_binary_real +types = complex ? (Complex64, Complex128) : (Float32, Float64) + +# arrays of inputs are stored in a Tuple. So later for calling use inp... to get the content of the Tuple +input = Dict( t => +[ + [(randindomain(t, NVALS, domain),) for (_, _, domain) in base_unary]; + [(randindomain(t, NVALS, domain1), randindomain(t, NVALS, domain2)) for (_, _, domain1, domain2) in base_binary]; + # (randindomain(t, NVALS, (0, 100)), randindomain(t, 1, (-1, 20))[1]) +] + for t in types) + +fns = [[x[1:2] for x in base_unary_real]; + [x[1:2] for x in base_binary_real]] +################################################################ +""" + bench(fns, input) + +benchmark function for VML.jl. Calls both Base and VML functions and stores the benchmarks in two nested Dict. First layer specifies type, and second layer specifies the function name. The result is a Tuple, 1st element being benchmark for Base/SpecialFunctions and 2nd element being for VML. + +# Examples +```julia +fns = [(:Base, :acos); (:Base, :atan); (:SpecialFunctions, :ref)] # array of tuples +input = Dict( Float64 => [(rand(1000)); (rand(1000), rand(1000)); (rand(1000))]) # Dict of array of tuples +times = bench(fns, input) + +times[Float64][:acos][1] # Base.acos benchmark for Float64 +times[Float64][:acos][2] # VML.acos benchmark for Float64 +``` +""" function bench(fns, input) - [t=>begin - times = Array(Vector{Float64}, length(fns)) - for ifn = 1:length(fns) - fn = fns[ifn] - inp = input[t][ifn] - fn(inp...) - gc() - nrep = max(iceil(2/(@elapsed (gc_disable(); fn(inp...); gc_enable(); gc()))), 3) - println("Running $nrep reps of $fn($t)") - @time times[ifn] = [begin - gc() - gc_disable() - time = @elapsed fn(inp...) - gc_enable() - time - end for i = 1:nrep] - # println((mean(times[ifn]), std(times[ifn]))) - end - times - end for t in types] + Dict(t => begin + Dict( fn[2] => begin + base_fn = eval(:($(fn[1]).$(fn[2]))) + vml_fn = eval(:(VML.$(fn[2]))) + println("benchmarking $vml_fn for type $t") + timesBase = @benchmark $base_fn.($inp...) + timesVML = @benchmark $vml_fn($inp...) + + [timesBase, timesVML] + end for (fn, inp) in zip(fns, input[t]) ) + end for t in types) end +################################################################ + +# do benchmark +benches = bench(fns, input) + +@save "benchmarkData.jld" benches +# @save "benchmarkData-complex.jld" benches + +# benches = load("benchmarkData.jld2", "benches") + -function ratioci(y, x, alpha=0.05) +# something is wrong with these +deleteat!(fns, [18, 31]) +delete!(benches[Float32], :lgamma) +delete!(benches[Float64], :lgamma) +delete!(benches[Float32], :log10) +delete!(benches[Float64], :log10) + +################################################################ + +""" +benchmark analysis function +""" +function ratioci(y, x, alpha = 0.05) tq² = abs2(quantile(TDist(length(x) + length(y) - 2), alpha)) μx = mean(x) σx² = varm(x, μx) μy = mean(y) σy² = varm(y, μy) - a = sqrt((μx*μy)^2 - (μx^2 - tq²*σx²)*(μy^2 - tq²*σy²)) - b = μx^2 - tq²*σx² - (((μx*μy) - a)/b, ((μx*μy) + a)/b) + a = sqrt((μx * μy)^2 - (μx^2 - tq² * σx²) * (μy^2 - tq² * σy²)) + b = μx^2 - tq² * σx² + return (((μx * μy) - a) / b, ((μx * μy) + a) / b) end -# First generate some random data and test functions in Base on it -const NVALS = 1_000_000 -base_unary = complex ? base_unary_complex : base_unary_real -base_binary = complex ? base_binary_complex : base_binary_real -types = complex ? (Complex64, Complex128) : (Float32, Float64) -input = [t=>[[(randindomain(t, NVALS, domain),) for (fn, domain) in base_unary]; - [(randindomain(t, NVALS, domain1), randindomain(t, NVALS, domain2)) - for (fn, domain1, domain2) in base_binary]; - (randindomain(t, NVALS, (0, 100)), randindomain(t, 1, (-1, 20))[1])] - for t in types] -fns = [[x[1] for x in base_unary]; [x[1] for x in base_binary]; (complex ? [] : .^)] +################################################################ -builtin = bench(fns, input) +""" +Does analysis of the benchmark data and plots them as bars. +""" +function plotBench() -# Now with VML -using VML +# Print ratio + colors = [:blue, :red] + for itype = 1:length(types) -vml = bench(fns, input) + # creating arrays of times from benchmarks + benchVals = collect(values(benches[types[itype]])) + builtint = [x[1].times for x in benchVals] + vmlt = [x[2].times for x in benchVals] -# Print ratio -clf() -colors = ["r", "y"] -for itype = 1:length(types) - builtint = builtin[types[itype]] - vmlt = vml[types[itype]] - μ = vec(map(mean, builtint)./map(mean, vmlt)) - ci = zeros(Float64, 2, length(fns)) - for ifn = 1:length(builtint) - lower, upper = ratioci(builtint[ifn], vmlt[ifn]) - ci[1, ifn] = μ[ifn] - lower - ci[2, ifn] = upper - μ[ifn] + # calculating mean of run times + μ = vec(map(mean, builtint) ./ map(mean, vmlt)) + + # error bar disabled because benchmark tools takes care of errors + + # # calculating error bars + # ci = zeros(Float64, 2, length(fns)) + # for ifn = 1:length(builtint) + # lower, upper = ratioci(builtint[ifn], vmlt[ifn]) + # ci[1, ifn] = μ[ifn] - lower + # ci[2, ifn] = upper - μ[ifn] + # end + + # adding bar + plt = bar!( + 0.2+(0.4*itype):length(fns), + μ, + # yerror = ci, + fillcolor = colors[itype], + labels = [string(x) for x in types], + dpi = 600 + ) end - bar(0.2+(0.4*itype):length(fns), μ, 0.4, yerr=ci, color=colors[itype], ecolor="k") -end -ax = gca() -ax[:set_xlim](0, length(fns)+1) -fname = [string(fn.env.name) for fn in fns] -if !complex - fname[end-1] = "A.^B" - fname[end] = "A.^b" + fname = [string(fn[2]) for fn in fns] + # if !complex + # fname[end-1] = "A.^B" + # fname[end] = "A.^b" + # end + xlims!(0, length(fns) + 1) + xticks!(1:length(fns)+1, fname, rotation = 70, fontsize = 10) + title!("VML Performance for array of size $NVALS") + ylabel!("Relative Speed (VML/Base)") + hline!([1], line=(4, :dash, 0.6, [:green]), labels = 1) + savefig("performance$(complex ? "_complex" : "").png") + end -xticks(1:length(fns)+1, fname, rotation=70, fontsize=10) -title("VML Performance") -ylabel("Relative Speed (Base/VML)") -legend([string(x) for x in types]) -ax[:axhline](1; color="black", linestyle="--") -savefig("performance$(complex ? "_complex" : "").png") + +################################################################ + +# do plotting +plotBench() diff --git a/benchmark/performance.png b/benchmark/performance.png index edf8a566987a1e84c7c131bfc8d18ac19d833901..12985d628e40699f9942374b5388b6c42a10aaaa 100644 GIT binary patch literal 247140 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 z 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

#y#L>cyHMh!#&zal?<^W)Mt#fIAd}@#kz_OrzC> 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�(4 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