From 2af54151bdd644e83fa91036f78f5880fac1e7e4 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 30 Sep 2024 00:02:48 +0200 Subject: [PATCH 1/2] Optimize mat_entry_ptr methods --- src/flint/FlintTypes.jl | 28 ++++++++++++++-------------- src/flint/fmpq_mat.jl | 4 +--- src/flint/fmpz_mat.jl | 2 +- src/flint/fmpz_mod_mat.jl | 4 +--- src/flint/fq_mat.jl | 4 +--- src/flint/fq_nmod_mat.jl | 4 +--- src/flint/gfp_fmpz_mat.jl | 4 +--- src/flint/nmod_mat.jl | 8 ++++++++ 8 files changed, 28 insertions(+), 30 deletions(-) diff --git a/src/flint/FlintTypes.jl b/src/flint/FlintTypes.jl index d9b03b320..c4bb4ad1b 100644 --- a/src/flint/FlintTypes.jl +++ b/src/flint/FlintTypes.jl @@ -4696,10 +4696,10 @@ const QQMatrixSpace = AbstractAlgebra.Generic.MatSpace{QQFieldElem} QQMatrixSpace(r::Int, c::Int) = QQMatrixSpace(QQ, r, c) mutable struct QQMatrix <: MatElem{QQFieldElem} - entries::Ptr{Nothing} + entries::Ptr{QQFieldElem} r::Int c::Int - rows::Ptr{Nothing} + rows::Ptr{Ptr{QQFieldElem}} view_parent # used by windows, not finalised!! @@ -4912,10 +4912,10 @@ end const zzModMatrixSpace = AbstractAlgebra.Generic.MatSpace{zzModRingElem} mutable struct zzModMatrix <: MatElem{zzModRingElem} - entries::Ptr{Nothing} + entries::Ptr{UInt} r::Int # Int c::Int # Int - rows::Ptr{Nothing} + rows::Ptr{Ptr{UInt}} n::UInt # mp_limb_t / Culong ninv::UInt # mp_limb_t / Culong norm::UInt # mp_limb_t / Culong @@ -5057,10 +5057,10 @@ end const ZZModMatrixSpace = AbstractAlgebra.Generic.MatSpace{ZZModRingElem} mutable struct ZZModMatrix <: MatElem{ZZModRingElem} - entries::Ptr{Nothing} + entries::Ptr{ZZRingElem} r::Int c::Int - rows::Ptr{Nothing} + rows::Ptr{Ptr{ZZRingElem}} # end flint struct base_ring::ZZModRing @@ -5215,10 +5215,10 @@ end const FpMatrixSpace = AbstractAlgebra.Generic.MatSpace{FpFieldElem} mutable struct FpMatrix <: MatElem{FpFieldElem} - entries::Ptr{Nothing} + entries::Ptr{ZZRingElem} r::Int c::Int - rows::Ptr{Nothing} + rows::Ptr{Ptr{ZZRingElem}} # end flint struct base_ring::FpField @@ -5324,10 +5324,10 @@ end const fpMatrixSpace = AbstractAlgebra.Generic.MatSpace{fpFieldElem} mutable struct fpMatrix <: MatElem{fpFieldElem} - entries::Ptr{Nothing} + entries::Ptr{UInt} r::Int # Int c::Int # Int - rows::Ptr{Nothing} + rows::Ptr{Ptr{UInt}} n::UInt # mp_limb_t / Culong ninv::UInt # mp_limb_t / Culong norm::UInt # mp_limb_t / Culong @@ -6071,10 +6071,10 @@ end const FqPolyRepMatrixSpace = AbstractAlgebra.Generic.MatSpace{FqPolyRepFieldElem} mutable struct FqPolyRepMatrix <: MatElem{FqPolyRepFieldElem} - entries::Ptr{Nothing} + entries::Ptr{FqPolyRepFieldElem} r::Int c::Int - rows::Ptr{Nothing} + rows::Ptr{Ptr{FqPolyRepFieldElem}} base_ring::FqPolyRepField view_parent @@ -6204,10 +6204,10 @@ end const fqPolyRepMatrixSpace = AbstractAlgebra.Generic.MatSpace{fqPolyRepFieldElem} mutable struct fqPolyRepMatrix <: MatElem{fqPolyRepFieldElem} - entries::Ptr{Nothing} + entries::Ptr{fqPolyRepFieldElem} r::Int c::Int - rows::Ptr{Nothing} + rows::Ptr{Ptr{fqPolyRepFieldElem}} base_ring::fqPolyRepField view_parent diff --git a/src/flint/fmpq_mat.jl b/src/flint/fmpq_mat.jl index 0c54f93c3..b26531780 100644 --- a/src/flint/fmpq_mat.jl +++ b/src/flint/fmpq_mat.jl @@ -1010,9 +1010,7 @@ end # ################################################################################ -@inline mat_entry_ptr(A::QQMatrix, i::Int, j::Int) = -ccall((:fmpq_mat_entry, libflint), - Ptr{QQFieldElem}, (Ref{QQMatrix}, Int, Int), A, i-1, j-1) +mat_entry_ptr(A::QQMatrix, i::Int, j::Int) = unsafe_load(A.rows, i) + (j-1)*2*sizeof(Ptr) ################################################################################ # diff --git a/src/flint/fmpz_mat.jl b/src/flint/fmpz_mat.jl index f3c516e1c..c68bfe033 100644 --- a/src/flint/fmpz_mat.jl +++ b/src/flint/fmpz_mat.jl @@ -2107,4 +2107,4 @@ end # ################################################################################ -@inline mat_entry_ptr(A::ZZMatrix, i::Int, j::Int) = unsafe_load(A.rows, i) + (j-1)*sizeof(UInt) +mat_entry_ptr(A::ZZMatrix, i::Int, j::Int) = unsafe_load(A.rows, i) + (j-1)*sizeof(Ptr) diff --git a/src/flint/fmpz_mod_mat.jl b/src/flint/fmpz_mod_mat.jl index 15423cc67..633c4389a 100644 --- a/src/flint/fmpz_mod_mat.jl +++ b/src/flint/fmpz_mod_mat.jl @@ -900,6 +900,4 @@ end # ################################################################################ -@inline mat_entry_ptr(A::ZZModMatrix, i::Int, j::Int) = -ccall((:fmpz_mod_mat_entry, libflint), Ptr{ZZRingElem}, - (Ref{ZZModMatrix}, Int, Int), A, i - 1, j - 1) +mat_entry_ptr(A::ZZModMatrix, i::Int, j::Int) = unsafe_load(A.rows, i) + (j-1)*sizeof(Ptr) diff --git a/src/flint/fq_mat.jl b/src/flint/fq_mat.jl index bfdd0c84e..6a1d591b0 100644 --- a/src/flint/fq_mat.jl +++ b/src/flint/fq_mat.jl @@ -764,6 +764,4 @@ end # ################################################################################ -@inline mat_entry_ptr(A::FqPolyRepMatrix, i::Int, j::Int) = -ccall((:fq_mat_entry, libflint), Ptr{FqPolyRepFieldElem}, - (Ref{FqPolyRepMatrix}, Int, Int), A, i - 1, j - 1) +mat_entry_ptr(A::FqPolyRepMatrix, i::Int, j::Int) = unsafe_load(A.rows, i) + (j-1)*(sizeof(Ptr)+2*sizeof(Int)) diff --git a/src/flint/fq_nmod_mat.jl b/src/flint/fq_nmod_mat.jl index 0c6843809..eecdb4436 100644 --- a/src/flint/fq_nmod_mat.jl +++ b/src/flint/fq_nmod_mat.jl @@ -753,6 +753,4 @@ end # ################################################################################ -@inline mat_entry_ptr(A::fqPolyRepMatrix, i::Int, j::Int) = -ccall((:fq_nmod_mat_entry, libflint), Ptr{fqPolyRepFieldElem}, - (Ref{fqPolyRepMatrix}, Int, Int), A, i - 1, j - 1) +mat_entry_ptr(A::fqPolyRepMatrix, i::Int, j::Int) = unsafe_load(A.rows, i) + (j-1)*(sizeof(Ptr)+5*sizeof(Int)) diff --git a/src/flint/gfp_fmpz_mat.jl b/src/flint/gfp_fmpz_mat.jl index 41cc7060b..73c8700ae 100644 --- a/src/flint/gfp_fmpz_mat.jl +++ b/src/flint/gfp_fmpz_mat.jl @@ -457,6 +457,4 @@ end # ################################################################################ -@inline mat_entry_ptr(A::FpMatrix, i::Int, j::Int) = -ccall((:fmpz_mod_mat_entry, libflint), Ptr{ZZRingElem}, - (Ref{FpMatrix}, Int, Int), A, i - 1, j - 1) +mat_entry_ptr(A::FpMatrix, i::Int, j::Int) = unsafe_load(A.rows, i) + (j-1)*sizeof(Ptr) diff --git a/src/flint/nmod_mat.jl b/src/flint/nmod_mat.jl index e47300de9..68c429a19 100644 --- a/src/flint/nmod_mat.jl +++ b/src/flint/nmod_mat.jl @@ -898,3 +898,11 @@ function kernel(::Solve.RREFTrait, M::Union{zzModMatrix, ZZModMatrix}; side::Sym end # For kernel(::HowellFormTrait, ...) we use generic AbstractAlgebra code + +################################################################################ +# +# Entry pointers +# +################################################################################ + +mat_entry_ptr(A::Zmodn_mat, i::Int, j::Int) = unsafe_load(A.rows, i) + (j-1)*sizeof(UInt) From fe7adac40b15785e00d7977db987503f530fb10f Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 30 Sep 2024 19:00:33 +0200 Subject: [PATCH 2/2] Apply suggestions from code review --- src/flint/fmpq_mat.jl | 2 +- src/flint/fmpz_mat.jl | 2 +- src/flint/fmpz_mod_mat.jl | 2 +- src/flint/fq_mat.jl | 6 ++++++ src/flint/fq_nmod_mat.jl | 9 +++++++++ src/flint/gfp_fmpz_mat.jl | 2 +- 6 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/flint/fmpq_mat.jl b/src/flint/fmpq_mat.jl index b26531780..4a18b6063 100644 --- a/src/flint/fmpq_mat.jl +++ b/src/flint/fmpq_mat.jl @@ -1010,7 +1010,7 @@ end # ################################################################################ -mat_entry_ptr(A::QQMatrix, i::Int, j::Int) = unsafe_load(A.rows, i) + (j-1)*2*sizeof(Ptr) +mat_entry_ptr(A::QQMatrix, i::Int, j::Int) = unsafe_load(A.rows, i) + (j-1)*sizeof(QQFieldElem) ################################################################################ # diff --git a/src/flint/fmpz_mat.jl b/src/flint/fmpz_mat.jl index c68bfe033..edbea7379 100644 --- a/src/flint/fmpz_mat.jl +++ b/src/flint/fmpz_mat.jl @@ -2107,4 +2107,4 @@ end # ################################################################################ -mat_entry_ptr(A::ZZMatrix, i::Int, j::Int) = unsafe_load(A.rows, i) + (j-1)*sizeof(Ptr) +mat_entry_ptr(A::ZZMatrix, i::Int, j::Int) = unsafe_load(A.rows, i) + (j-1)*sizeof(ZZRingElem) diff --git a/src/flint/fmpz_mod_mat.jl b/src/flint/fmpz_mod_mat.jl index 633c4389a..a36bf5679 100644 --- a/src/flint/fmpz_mod_mat.jl +++ b/src/flint/fmpz_mod_mat.jl @@ -900,4 +900,4 @@ end # ################################################################################ -mat_entry_ptr(A::ZZModMatrix, i::Int, j::Int) = unsafe_load(A.rows, i) + (j-1)*sizeof(Ptr) +mat_entry_ptr(A::ZZModMatrix, i::Int, j::Int) = unsafe_load(A.rows, i) + (j-1)*sizeof(ZZRingElem) diff --git a/src/flint/fq_mat.jl b/src/flint/fq_mat.jl index 6a1d591b0..1dd74e5bf 100644 --- a/src/flint/fq_mat.jl +++ b/src/flint/fq_mat.jl @@ -764,4 +764,10 @@ end # ################################################################################ +# each matrix entry consists of +# coeffs :: Ptr{Nothing} +# alloc :: Int +# length :: Int +# The `parent` member of struct FqPolyRepFieldElem is not replicated in each +# struct member, so we cannot use `sizeof(FqPolyRepFieldElem)`. mat_entry_ptr(A::FqPolyRepMatrix, i::Int, j::Int) = unsafe_load(A.rows, i) + (j-1)*(sizeof(Ptr)+2*sizeof(Int)) diff --git a/src/flint/fq_nmod_mat.jl b/src/flint/fq_nmod_mat.jl index eecdb4436..515a17a76 100644 --- a/src/flint/fq_nmod_mat.jl +++ b/src/flint/fq_nmod_mat.jl @@ -753,4 +753,13 @@ end # ################################################################################ +# each matrix entry consists of +# coeffs :: Ptr{Nothing} +# alloc :: Int +# length :: Int +# n :: Int +# ninv :: Int +# norm :: Int +# The `parent` member of struct fqPolyRepFieldElem is not replicated in each +# struct member, so we cannot simply use `sizeof(fqPolyRepFieldElem)`. mat_entry_ptr(A::fqPolyRepMatrix, i::Int, j::Int) = unsafe_load(A.rows, i) + (j-1)*(sizeof(Ptr)+5*sizeof(Int)) diff --git a/src/flint/gfp_fmpz_mat.jl b/src/flint/gfp_fmpz_mat.jl index 73c8700ae..cdfa893cf 100644 --- a/src/flint/gfp_fmpz_mat.jl +++ b/src/flint/gfp_fmpz_mat.jl @@ -457,4 +457,4 @@ end # ################################################################################ -mat_entry_ptr(A::FpMatrix, i::Int, j::Int) = unsafe_load(A.rows, i) + (j-1)*sizeof(Ptr) +mat_entry_ptr(A::FpMatrix, i::Int, j::Int) = unsafe_load(A.rows, i) + (j-1)*sizeof(ZZRingElem)