From c77c2ab33231619ec78dd3af0e7df6506309e355 Mon Sep 17 00:00:00 2001 From: Tim Holy Date: Mon, 15 Jul 2024 10:44:17 -0500 Subject: [PATCH] Get lib example working, create build script (#55104) Note this is a PR against #55047 Co-authored by: Gabriel Baraldi --- juliac/lib_examples/liblinsolve.jl | 69 --------------------- juliac/lib_examples/linsolve/Project.toml | 9 +++ juliac/lib_examples/linsolve/build.sh | 12 ++++ juliac/lib_examples/linsolve/liblinsolve.jl | 13 ++++ juliac/test/test.c | 5 +- 5 files changed, 37 insertions(+), 71 deletions(-) delete mode 100644 juliac/lib_examples/liblinsolve.jl create mode 100644 juliac/lib_examples/linsolve/Project.toml create mode 100755 juliac/lib_examples/linsolve/build.sh create mode 100644 juliac/lib_examples/linsolve/liblinsolve.jl diff --git a/juliac/lib_examples/liblinsolve.jl b/juliac/lib_examples/liblinsolve.jl deleted file mode 100644 index 2c156932f883b..0000000000000 --- a/juliac/lib_examples/liblinsolve.jl +++ /dev/null @@ -1,69 +0,0 @@ -module Lib - -using OpenBLAS_jll, PrecompileTools, SparseArrays, RecursiveFactorization, StrideArraysCore, Static, LinearAlgebra, Logging - -function take_heap_snapshot() - flags = Base.open_flags( - read = true, - write = true, - create = true, - truncate = true, - append = false, - ) - fname = "lala.heapsnapshot" - s = IOStream("") - ccall(:ios_file, Ptr{Cvoid}, - (Ptr{UInt8}, Cstring, Cint, Cint, Cint, Cint), - s.ios, fname, flags.read, flags.write, flags.create, flags.truncate) - ccall(:jl_gc_take_heap_snapshot, Cvoid, (Ptr{Cvoid}, Cchar), s.handle, Cchar(false)) - ccall(:ios_close, Cint, (Ptr{Cvoid},), s.ios) - return nothing -end - -Base.@ccallable function linsolve10(A::Ptr{Float64}, b::Ptr{Float64})::Ptr{Float64} - OpenBLAS_jll.__init__() - LinearAlgebra.libblastrampoline_jll.__init__() - LinearAlgebra.__init__() - # SparseArrays.CHOLMOD.__init__() - N = 10 - piv = Ref{NTuple{N, Int}}() - D = static(N) - GC.@preserve piv begin - F = RecursiveFactorization.lu!(PtrArray(A, (D, D)), - PtrArray(Base.unsafe_convert(Ptr{Int}, piv), (D,))) - ldiv!(F, PtrArray(b, (D,))) - end - # take_heap_snapshot() - return b -end - - @setup_workload begin - # Putting some things in `@setup_workload` instead of `@compile_workload` can reduce the size of the - # precompile file and potentially make loading faster. - N=10 - A = rand(N, N); b = rand(N) - - @compile_workload begin - Sys.__init__() - OpenBLAS_jll.__init__() - LinearAlgebra.libblastrampoline_jll.__init__() - LinearAlgebra.__init__() - # SparseArrays.CHOLMOD.__init__() - GC.@preserve A b begin - linsolve10(pointer(A), pointer(b)) - end - end - end - precompile(Core.current_scope, ()) - precompile(! ,(Bool,)) - precompile(Base._str_sizehint, (String,)) - precompile(Base._str_sizehint, (UInt32,)) - precompile(print, (Base.GenericIOBuffer{Array{UInt8, 1}}, String)) - precompile(print, (Base.GenericIOBuffer{Array{UInt8, 1}}, UInt32)) - precompile(join , (Base.GenericIOBuffer{Array{UInt8, 1}}, Array{Base.SubString{String}, 1}, String)) - precompile(join , (Base.GenericIOBuffer{Array{UInt8, 1}}, Array{String, 1}, Char)) - precompile(Base.showerror_nostdio, (Core.MissingCodeError, String)) - precompile(Base.VersionNumber, (UInt32, UInt32, UInt32, Tuple{}, Tuple{})) - precompile(linsolve10, (Ptr{Float64}, Ptr{Float64})) - precompile(Base.CoreLogging.shouldlog, (Base.CoreLogging.SimpleLogger, Base.CoreLogging.LogLevel, Module, Symbol, Symbol)) -end diff --git a/juliac/lib_examples/linsolve/Project.toml b/juliac/lib_examples/linsolve/Project.toml new file mode 100644 index 0000000000000..753e0c36045b6 --- /dev/null +++ b/juliac/lib_examples/linsolve/Project.toml @@ -0,0 +1,9 @@ +[deps] +LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" +Logging = "56ddb016-857b-54e1-b83d-db4d58db5568" +OpenBLAS_jll = "4536629a-c528-5b80-bd46-f80d51c5b363" +PrecompileTools = "aea7be01-6a6a-4083-8856-8a6e6704d82a" +RecursiveFactorization = "f2c3362d-daeb-58d1-803e-2bc74f2840b4" +SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" +Static = "aedffcd0-7271-4cad-89d0-dc628f76c6d3" +StrideArraysCore = "7792a7ef-975c-4747-a70f-980b88e8d1da" diff --git a/juliac/lib_examples/linsolve/build.sh b/juliac/lib_examples/linsolve/build.sh new file mode 100755 index 0000000000000..a2de8422b7e9e --- /dev/null +++ b/juliac/lib_examples/linsolve/build.sh @@ -0,0 +1,12 @@ +#! /bin/bash +if [ ! -f Manifest.toml ]; then + echo "Instantiating package environment..." + ../../../julia --project -e 'using Pkg; Pkg.instantiate()' + echo "done" +fi +echo "Building library..." +../../../julia --project ../../juliac.jl --output-lib liblinsolve --compile-ccallable --static-call-graph liblinsolve.jl +echo "done" +echo "Linking C main..." +gcc -o linsolve10 -L. -Wl,-rpath,\$ORIGIN ../../test/test.c -llinsolve +echo "done" diff --git a/juliac/lib_examples/linsolve/liblinsolve.jl b/juliac/lib_examples/linsolve/liblinsolve.jl new file mode 100644 index 0000000000000..5e7e2a2ccfa92 --- /dev/null +++ b/juliac/lib_examples/linsolve/liblinsolve.jl @@ -0,0 +1,13 @@ +module Lib + +using LinearAlgebra + +Base.@ccallable function linsolve10(A_ptr::Ptr{Float64}, b_ptr::Ptr{Float64}, N::Csize_t)::Ptr{Float64} + A = unsafe_wrap(Array, A_ptr, (N,N)) + b = unsafe_wrap(Array, b_ptr, N) + F = lu!(A) + ldiv!(F, b) + return b_ptr +end + +end diff --git a/juliac/test/test.c b/juliac/test/test.c index c910902d80599..e1eeb28dcebfd 100644 --- a/juliac/test/test.c +++ b/juliac/test/test.c @@ -1,6 +1,7 @@ #include -double* linsolve10(double *A, double *b); +double* linsolve10(double * A, double * b, size_t N); + int main() { // Declare a 10x10 matrix double A[10][10] = { @@ -27,7 +28,7 @@ int main() { -10.107200370651855, 0.8478731362967014}; - linsolve10(A, b); + linsolve10((double*)A, (double*)b, 10); for (int i = 0; i < 10; i++) { printf("%f\n", b[i]); }