On Tue, Jul 30, 2013 at 3:38 AM, Armin Rigo <ar...@tunes.org> wrote:

> Hi Sean,
>
> On Sun, Jul 7, 2013 at 10:23 PM, Sean Fisk <seanf...@gmail.com> wrote:
> > Sorry, I didn't make it clear: my project is actually an interpreter for
> a
> > stencil-based language that is used for solving partial differential
> > equations. So I think that RPython is the right tool to an extent. It
> worked
> > very well for writing the interpreter (I also used Alex Gaynor's rply).
> > However, now I would like to parallelize the solver (i.e., the matrix
> > operations).
> >
> > I sounds as if this is where RPython stops being the right tool for the
> job,
> > since threading is useful only for concurrency and not speed, as in
> Python.
> > Thank you for letting me know before I spent too much time on it! I
> suppose
> > I should have guessed from the code I was writing.
>
> Sorry for not answering you earlier.  The point is that, indeed, you
> are right and I have no obvious solution to propose.  RPython is
> really designed to write high-level interpreters in, and so it doesn't
> worry about real multicore usage.  (In fact, the STM approach
> currently worked on is about giving multicore usage anyway, but
> without changing the basic model of a GIL, which is not what you
> need.)
>
> It all depends on what the performance characteristics of your
> interpreter are.  Do you spend a lot of time in the interpreter
> itself, or rather in library code?  In the latter case, RPython is not
> the best approach --- e.g. its JIT is useless, and it's a case where
> multithreading would really help.  I'm guessing that your interpreter
> is somewhere in the middle...
>

I am in the process of profiling and running benchmarks right now, but that
is absolutely something I would need to find out before starting on any
parallel solution.

>
> > I am seeing two options, on which I welcome comment:
> >
> > Continue using RPython and use rffi to make calls to C, where I implement
> > the solver function for high speed, optionally with threading or
> > message-passing. I've used pthreads, OpenMP, and MPI a number of times
> > before, but combining that with rffi might be a little over my head.
> >
> > Switch to using PyPy with multiprocessing and/or numpypy. Happily, my
> code
> > runs under PyPy and CPython albeit with some RPython libraries and some
> > RPython-specific workarounds (e.g., boxes).
>
> If you want to run several regular Python threads and still get
> multicore usage, one of the reasonably easy approaches right now would
> be to write pure Python code containing calls to C functions written
> with CFFI's verify().  These calls are done with the GIL released
> (both on CPython and PyPy).
>
> If instead you'd rather have a single Python thread driving calls to C
> functions that internally spawn several threads, then indeed OpenMP or
> MPI seems better.  In this case it's easier to embed into an RPython
> program with rffi.  You basically have to write C code that exposes
> some simple single-threaded API to the RPython program.  You would use
> threads only internally, on the C side.
>

These are both very reasonable suggestions. Thank you for clearly spelling
out my best options.

Unfortunately, my internship is coming to an end, and I am unsure whether I
will get the chance to implement them. If I do implement them, however,
I'll make a point to write about my experience so that others can benefit
from these solutions.

Thank you for the answer, Armin.

- Sean

>
>
> A bientôt,
>
> Armin.
>
_______________________________________________
pypy-dev mailing list
pypy-dev@python.org
http://mail.python.org/mailman/listinfo/pypy-dev

Reply via email to