From 7b964027a5dbd99887d403cf24fd5a2c0ce8f7a5 Mon Sep 17 00:00:00 2001 From: Sunoru Date: Sun, 27 Feb 2022 00:57:52 -0500 Subject: [PATCH 1/4] Remove `deps` folder and check AES-NI in `__init__()`. --- deps/build.jl | 24 --------------- src/Random123.jl | 38 +++++++++++++++++------- src/{ => aesni}/aesni.jl | 0 src/{ => aesni}/ars.jl | 0 src/{aesni_common.jl => aesni/common.jl} | 3 ++ {deps => src/aesni}/has_aesni.jl | 0 src/aesni/module.jl | 14 +++++++++ src/common.jl | 6 ---- test/aesni.jl | 2 +- test/ars.jl | 2 +- 10 files changed, 47 insertions(+), 42 deletions(-) delete mode 100644 deps/build.jl rename src/{ => aesni}/aesni.jl (100%) rename src/{ => aesni}/ars.jl (100%) rename src/{aesni_common.jl => aesni/common.jl} (95%) rename {deps => src/aesni}/has_aesni.jl (100%) create mode 100644 src/aesni/module.jl diff --git a/deps/build.jl b/deps/build.jl deleted file mode 100644 index eaa608a..0000000 --- a/deps/build.jl +++ /dev/null @@ -1,24 +0,0 @@ -disabled() = get(ENV, "R123_DISABLE_AESNI", "") != "" - -const deps_dir = dirname(@__FILE__) - -has_aesni() = try - cmd = Base.julia_cmd() - push!(cmd.exec, joinpath(deps_dir, "has_aesni.jl")) - run(cmd) - true -catch - false -end - -const filename = joinpath(deps_dir, "aes-ni") -isfile(filename) && rm(filename) - -if disabled() - @info "AES-NI is disabled." -elseif has_aesni() - @info "AES-NI is enabled." - touch(filename) -else - @info "AES-NI is not supported." -end diff --git a/src/Random123.jl b/src/Random123.jl index 3f23dd4..e4d03d1 100644 --- a/src/Random123.jl +++ b/src/Random123.jl @@ -18,7 +18,7 @@ module Random123 using RandomNumbers -export R123_USE_AESNI, set_counter! +export set_counter! include("common.jl") export Threefry2x, Threefry4x @@ -27,15 +27,33 @@ include("threefry.jl") export Philox2x, Philox4x include("philox.jl") -if R123_USE_AESNI - include("aesni_common.jl") - export AESNI1x, AESNI4x - include("aesni.jl") - - export ARS1x, ARS4x - include("ars.jl") -else - @warn "AES-NI is not enabled, so AESNI and ARS are not available." +"True when AES-NI has been enabled." +const R123_USE_AESNI = Ref(false) +export R123_USE_AESNI +export AESNI1x, AESNI4x +export ARS1x, ARS4x + +function __init__() + + aesni_dir = joinpath(dirname(@__FILE__), "aesni") + R123_USE_AESNI[] = try + cmd = Base.julia_cmd() + script = joinpath(aesni_dir, "has_aesni.jl") + push!(cmd.exec, script) + run(cmd) + true + catch + false + end + + if R123_USE_AESNI[] + include(joinpath(aesni_dir, "module.jl")) + @eval using ._AESNIModule + else + @warn "AES-NI is not enabled, so AESNI and ARS are not available." + end + + nothing end end diff --git a/src/aesni.jl b/src/aesni/aesni.jl similarity index 100% rename from src/aesni.jl rename to src/aesni/aesni.jl diff --git a/src/ars.jl b/src/aesni/ars.jl similarity index 100% rename from src/ars.jl rename to src/aesni/ars.jl diff --git a/src/aesni_common.jl b/src/aesni/common.jl similarity index 95% rename from src/aesni_common.jl rename to src/aesni/common.jl index 4f20cd0..4079cdd 100644 --- a/src/aesni_common.jl +++ b/src/aesni/common.jl @@ -1,6 +1,9 @@ using Base: llvmcall import Base.(+) +using ..Random123: R123Generator1x, R123Generator4x +import ..Random123: random123_r, set_counter! + const __m128i = NTuple{2, VecElement{UInt64}} Base.convert(::Type{__m128i}, x::UInt128) = unsafe_load(Ptr{__m128i}(pointer_from_objref(Ref(x)))) Base.convert(::Type{UInt128}, x::__m128i) = unsafe_load(Ptr{UInt128}(pointer_from_objref(Ref(x)))) diff --git a/deps/has_aesni.jl b/src/aesni/has_aesni.jl similarity index 100% rename from deps/has_aesni.jl rename to src/aesni/has_aesni.jl diff --git a/src/aesni/module.jl b/src/aesni/module.jl new file mode 100644 index 0000000..cce0d8b --- /dev/null +++ b/src/aesni/module.jl @@ -0,0 +1,14 @@ +module _AESNIModule + +using ..Random123 + +export __m128i, AESNIKey +include("common.jl") + +export AESNI1x, AESNI4x +include("aesni.jl") + +export ARS1x, ARS4x +include("ars.jl") + +end diff --git a/src/common.jl b/src/common.jl index 71bece2..def3d39 100644 --- a/src/common.jl +++ b/src/common.jl @@ -2,12 +2,6 @@ import Libdl import Random: rand, seed! import RandomNumbers: AbstractRNG -const _dep_dir = joinpath(dirname(@__FILE__), "../deps/") -include_dependency(joinpath(_dep_dir, "build.log")) - -"True when AES-NI has been enabled." -const R123_USE_AESNI = isfile(joinpath(_dep_dir, "aes-ni")) - const R123Array1x{T<:Union{UInt128}} = NTuple{1, T} const R123Array2x{T<:Union{UInt32, UInt64}} = NTuple{2, T} const R123Array4x{T<:Union{UInt32, UInt64}} = NTuple{4, T} diff --git a/test/aesni.jl b/test/aesni.jl index 7fc9ab4..7ea1935 100644 --- a/test/aesni.jl +++ b/test/aesni.jl @@ -1,4 +1,4 @@ -if R123_USE_AESNI +if R123_USE_AESNI[] import Random: seed! using Test: @test diff --git a/test/ars.jl b/test/ars.jl index 648687d..cb46494 100644 --- a/test/ars.jl +++ b/test/ars.jl @@ -1,4 +1,4 @@ -if R123_USE_AESNI +if R123_USE_AESNI[] import Random: seed! using Test: @test From 46ede964c9c1e407c79c07ddbd15c131621810b0 Mon Sep 17 00:00:00 2001 From: Sunoru Date: Sun, 27 Feb 2022 01:10:07 -0500 Subject: [PATCH 2/4] Use `success` to run the process. --- src/Random123.jl | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Random123.jl b/src/Random123.jl index e4d03d1..318754c 100644 --- a/src/Random123.jl +++ b/src/Random123.jl @@ -40,8 +40,7 @@ function __init__() cmd = Base.julia_cmd() script = joinpath(aesni_dir, "has_aesni.jl") push!(cmd.exec, script) - run(cmd) - true + success(cmd) catch false end From 6be706eb11e23b006a72996cf4cdeb4bdf45a563 Mon Sep 17 00:00:00 2001 From: Sunoru Date: Wed, 2 Mar 2022 15:21:51 -0500 Subject: [PATCH 3/4] Test. --- .github/workflows/build.yml | 4 ++-- src/Random123.jl | 16 +++++++++++----- src/aesni/has_aesni.jl | 5 ----- 3 files changed, 13 insertions(+), 12 deletions(-) delete mode 100644 src/aesni/has_aesni.jl diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b795eec..3a4ff9b 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -15,8 +15,8 @@ jobs: runs-on: ${{ matrix.os }} strategy: matrix: - julia-version: ["1.5", "1.6", nightly] - julia-arch: [x64] + julia-version: ["1.5", "1.7", nightly] + julia-arch: [x64, x86] os: [ubuntu-latest, windows-latest, macOS-latest] steps: diff --git a/src/Random123.jl b/src/Random123.jl index 318754c..53ab0b5 100644 --- a/src/Random123.jl +++ b/src/Random123.jl @@ -32,21 +32,27 @@ const R123_USE_AESNI = Ref(false) export R123_USE_AESNI export AESNI1x, AESNI4x export ARS1x, ARS4x +include("./aesni/module.jl") function __init__() - aesni_dir = joinpath(dirname(@__FILE__), "aesni") R123_USE_AESNI[] = try cmd = Base.julia_cmd() - script = joinpath(aesni_dir, "has_aesni.jl") - push!(cmd.exec, script) + push!( + cmd.exec, "-e", + "const __m128i = NTuple{2, VecElement{UInt64}};" * + "@assert ccall(\"llvm.x86.aesni.aeskeygenassist\", " * + "llvmcall, __m128i, (__m128i, UInt8), " * + "__m128i((0x0123456789123450, 0x9876543210987654)), 0x1) ≡ " * + "__m128i((0x857c266f7c266e85, 0x2346382146382023))" + ) success(cmd) - catch + catch e + @show e false end if R123_USE_AESNI[] - include(joinpath(aesni_dir, "module.jl")) @eval using ._AESNIModule else @warn "AES-NI is not enabled, so AESNI and ARS are not available." diff --git a/src/aesni/has_aesni.jl b/src/aesni/has_aesni.jl deleted file mode 100644 index d3d010e..0000000 --- a/src/aesni/has_aesni.jl +++ /dev/null @@ -1,5 +0,0 @@ -const __m128i = NTuple{2, VecElement{UInt64}} -@assert ccall( - "llvm.x86.aesni.aeskeygenassist", llvmcall, __m128i, (__m128i, UInt8), - __m128i((0x0123456789123450, 0x9876543210987654)), 0x1 -) ≡ __m128i((0x857c266f7c266e85, 0x2346382146382023)) From ef42ab295c5548fd103b8e353ae1b372c3daa239 Mon Sep 17 00:00:00 2001 From: Sunoru Date: Wed, 2 Mar 2022 15:23:39 -0500 Subject: [PATCH 4/4] No x86 on MacOS. --- .github/workflows/build.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 3a4ff9b..af9b5c2 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -18,6 +18,9 @@ jobs: julia-version: ["1.5", "1.7", nightly] julia-arch: [x64, x86] os: [ubuntu-latest, windows-latest, macOS-latest] + exclude: + - os: macOS-latest + julia-arch: x86 steps: - uses: actions/checkout@v2