Den tir. 24. nov. 2020 kl. 15.12 skrev Dominik Pantůček < [email protected]>:
> Hello, > > > If you are after numerical calculations for mxn matrices, then look at > > `flomat` > > which uses the same underlying C/Fortran library that NumPy uses. > > > > https://docs.racket-lang.org/manual-flomat/index.html > > > > If you need rrays with more dimensions than 2 use `math/array`. > > > > If you need simple computation of 1-dimensional data, you can use > > standard Racket vectors (or flomats or arrays). > > I didn't know about `flomat'. Thanks for (yet another) good hint. > > However, for my project I needed really fast matrix multiplication (and > other basic linear algebra functions). It turned out that most of the > available options are sub-optimal at best. To my surprise `flomat` is > one of those. > > Mostly I am concerned with 3D and 4D matrices and vectors. > > During the past few months I hacked together a fairly optimized > module[1] for performing these operations that defines algebras for > given dimension during macro expansion stage and all the procedures are > constructed in a way that helps Racket (mainly CS) perform all > operations unboxed. > > In the repository, there is a benchmark script, which yields the > following (self-explanatory) results: > > ==== Welcome to Racket v7.9.0.5 [cs]. > ... > What puzzles me the most: when I read `flomat' documentation, I thought > it must beat my implementation by far margin - it's a native code for > really basic number crunching. When using the `times!' variant of matrix > multiplication, I would expect it to outperform anything implemented in > in pure Racket. > > Is there something I miss or is it really the case, that carefully > crafted Racket implementation is the fastest option right now? > I think the main reason that flomat matrices are slower than your flalgebra ones is the cost of the FFI call. The cost of calling a C foreign function doesn't depend on the size of the matrix though - so for large matrices the cost is negligible. However for small matrices, it is faster to stay in the Racket world. I believe game libraries in C also implement their own 3x3 matrices rather than using BLAS/LAPACK. BLAS can handle very large matrices and makes an effort to give good results even for ill-conditioned matrices. > I actually wanted to write a similar email some time ago - in the spring > - about the typed math/matrix variant. But I was almost certain I am > doing something wrong and should figure it out. Now I am more and more > convinced that the performance of all number crunching libraries - as > they can be used in Racket - might be the real issue here. > I have somewhat regretted that the matrices in math/matrix used math/array arrays to represent matrices directly. A traditional approach would have been better. However math/matrix matrices are more general - they also work when you need matrices over exact integers or over rationals. In order from slowest to fastest (when used for floats over 3x3 matrices): math/matrix (most general, very slow) flomat (only floats, arbitrary size) flagebra (floats, square only?) To satisfy my curiosity, of the performance of flomat: One way to get a little extra performance out of flomat! is to use times! instead of times. This avoids the repeated allocation. The code of times! is: [image: image.png] For a more direct call to the C multiplication routine: [image: image.png] So `(flomat! A B C)` will compute A*B and store it in C. Maybe there is a specialized A*B only routine in BLAS that can be used instead? The benchmarks suggest that the `times` in flomat can be improved for smaller matrices by calling specialized routines written in Racket. If you (or anyone else) are interested in improving `flomat` for multiplying smaller matrices, I would be glad to receive patches. Btw - you have some fancy tricks in `flalgebra.rkt` ! /Jens Axel -- You received this message because you are subscribed to the Google Groups "Racket Users" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/racket-users/CABefVgxaLO%2Bz%2BHm04iMFu5nrTPFH8KkusCGoSNyHH%3D_bdT3L9A%40mail.gmail.com.

