Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Trac #12103: Use MeatAxe as an optional back end for dense matrices o…
…ver `GF(p^n)`, p odd, n>1, `p^n<255` Sage has (or will soon have) fairly good implementations of dense matrices over `GF(2)`, over `GF(2^e)` (#9562) and over `GF(p)` (p prime, #4260). However, it uses generic code for dense matrices over `GF(p^n)`, p odd, n>1, `p^n<255`. The original suggestion was to use a major modification of `MeatAxe Release 2.2.4` instead of the basic implementation. The timings below are with that old version (it is identical with 2.2.3 except for the GPL licence, and 2.2.3 was before 1998). I now suggest to try and do the same with the latest !MeatAxe release 2.4.24, which is from 2011. There also is an experimental 2.5.0 from 2003, but I think we shouldn't rely on that. '''__Sources__''' The upstream sources http://www.math.rwth- aachen.de/~MTX/meataxe-2.4.24.tar.gz needed to be repackaged, in order to unpack into a single folder. Use attachment:meataxe-2.4.24.tar.gz '''__What is done__''' There is no spkg-check. However, if SAGE_CHECK=yes or of one does `sage -i -c meataxe`, then a test suite is executed as part of building the package. It is my experience that the tests pass most of the time. I can not explain why sometimes they don't. '''__What is missing__''' Currently, the spkg installs libmtx.a and installs some binaries. However, I also intend to add a Cython wrapper so that one can use !MeatAxe matrices in Sage. Here is the original ticket description: This is awfully slow: {{{ sage: MS = MatrixSpace(GF(5^3,'y'),2000) sage: %time A = MS.random_element() CPU times: user 6.36 s, sys: 0.02 s, total: 6.39 s Wall time: 6.41 s sage: type(A) <type 'sage.matrix.matrix_generic_dense.Matrix_generic_dense'> sage: B = MS.random_element() sage: %time A*B # using 6.3% of my computer's memory CPU times: user 744.20 s, sys: 1.18 s, total: 745.38 s Wall time: 747.69 s 2000 x 2000 dense matrix over Finite Field in y of size 5^3 sage: %time ~A # using 10.4% of my computer's memory CPU times: user 1096.74 s, sys: 1.30 s, total: 1098.05 s Wall time: 1101.24 s 2000 x 2000 dense matrix over Finite Field in y of size 5^3 sage: %time A.echelon_form() # using 10.4% of my computer's memory CPU times: user 378.62 s, sys: 0.33 s, total: 378.95 s Wall time: 380.06 s 2000 x 2000 dense matrix over Finite Field in y of size 5^3 }}} With the optional spkg and the patch, one gets a clear improvement. {{{ sage: MS = MatrixSpace(GF(5^3,'y'),2000) sage: %time A = MS.random_element() CPU times: user 0.32 s, sys: 0.00 s, total: 0.32 s Wall time: 0.33 s sage: type(A) <type 'sage.matrix.matrix_modpn_dense.Matrix_modpn_dense'> sage: B = MS.random_element() # The following uses Strassen-Winograd multiplication sage: %time A*B # using 3.5% of my computer's memory CPU times: user 7.68 s, sys: 0.01 s, total: 7.69 s Wall time: 7.72 s 2000 x 2000 dense matrix over Finite Field in y of size 5^3 # The following is school book multiplication; # that's more or less the original meataxe speed: sage: %time A._multiply_classical(B) # using 3.6% of my computer's memory CPU times: user 11.68 s, sys: 0.02 s, total: 11.70 s Wall time: 11.73 s 2000 x 2000 dense matrix over Finite Field in y of size 5^3 # Strassen is not implemented for inversion and echelon form. sage: %time ~A # using 3.8% of my computer's memory CPU times: user 23.55 s, sys: 0.00 s, total: 23.55 s Wall time: 23.62 s 2000 x 2000 dense matrix over Finite Field in y of size 5^3 sage: %time A.echelon_form() #using 3.9% of my computer's memory CPU times: user 11.73 s, sys: 0.01 s, total: 11.74 s Wall time: 11.78 s 2000 x 2000 dense matrix over Finite Field in y of size 5^3 }}} URL: http://trac.sagemath.org/12103 Reported by: SimonKing Ticket author(s): Simon King Reviewer(s): Jeroen Demeyer, Travis Scrimshaw
- Loading branch information