Does Julia based on LLVM auto-vectorize the code? I assume yes because you specifically mention SIMD design of the data structure.
Have you tried NumPyPy? Development on NumPyPy has not continued, but it probably would be a better comparison of what PyPy with auto-vectorization could accomplish to compare with Julia. Thanks, David On Fri, Dec 18, 2020 at 2:56 PM PIERRE AUGIER <pierre.aug...@univ-grenoble-alpes.fr> wrote: > > Hi, > > I post on this list a message written in PyPy issue tracker > (https://foss.heptapod.net/pypy/pypy/-/issues/3349#note_150255). It is about > some experiments I did on writing efficient implementations of the NBody > problem https://github.com/paugier/nbabel to potentially answer to this > article https://arxiv.org/pdf/2009.11295.pdf. > > I get from a PR an [interesting optimized implementation in > Julia](https://github.com/paugier/nbabel/blob/master/julia/nbabel4_serial.jl). > It is very fast (even slightly faster than in Pythran). One idea is to store > the 3 floats of a 3d physical vector, (x, y, z), in a struct `Point4D` > containing 4 floats to better use simd instructions. > > I added a pure Python implementation inspired by this new Julia > implementation (but with a simple `Point3D` with 3 floats because with PyPy, > the `Point4D` does not make the code faster) and good news it is with PyPy a > bit faster than our previous PyPy implementations (only 3 times slower than > the old C++ implementation). > > However, it is much slower than with Julia (while the code is very similar). > I coded a simplified version in Julia with nearly nothing else that what can > be written in pure Python (in particular, no `@inbounds` and `@simd` macros). > It seems to me that the comparison of these 2 versions could be interesting. > So I again simplified these 2 versions to keep only what is important for > performance, which gives > > - https://github.com/paugier/nbabel/blob/master/py/microbench_pypy4.py > - https://github.com/paugier/nbabel/blob/master/py/microbench_ju4.jl > > The results are summarized in > https://github.com/paugier/nbabel/blob/master/py/microbench.md > > An important point is that with `Point3D` (a mutable class in Python and an > immutable struct in Julia), Julia is 3.6 times faster than PyPy. Same code > and nothing really fancy in Julia so I guess that PyPy might be missing some > optimization opportunities. At least it would be interesting to understand > what is slower in PyPy (and why). I have to admit that I don't know how to > get interesting information on timing and what is happening with PyPy JIT in > a particular case. I only used cProfile and it's of course clearly not > enough. I can run vmprof but I'm not able to visualize the data because the > website http://vmprof.com/ is down. I don't know if I can trust values given > by IPython `%timeit` for particular instructions since I don't know if PyPy > JIT does the same thing in `%timeit` and in the function > `compute_accelerations`. > > I also feel that I really miss in pure Python an efficient fixed size > homogeneous mutable sequence (a "Vector" in Julia words) that can contain > basic numerical types (as Python `array.array`) but also instances of > user-defined classes and instances of Vectors. The Python code uses a [pure > Python implementation using a > list](https://github.com/paugier/nbabel/blob/master/py/vector.py). I think it > would be reasonable to have a good implementation highly compatible with PyPy > (and potentially other Python implementations) in a package on PyPI. It would > really help to write PyPy compatible numerical codes. What would be the good > tool to implement such package? HPy? I wonder whether we can get some speedup > compared to the pure Python version with lists. For very simple classes like > `Point3d` and `Point4d`, I wonder if the data could be saved continuously in > memory and if some operations could be done without boxing/unboxing. > > However, I really don't know what is slower in PyPy / faster in Julia. > > I would be very interested to get the points of view of people knowing well > PyPy. > > Pierre > _______________________________________________ > pypy-dev mailing list > pypy-dev@python.org > https://mail.python.org/mailman/listinfo/pypy-dev _______________________________________________ pypy-dev mailing list pypy-dev@python.org https://mail.python.org/mailman/listinfo/pypy-dev