[m-rev.] for post-commit review: document .par grades
Zoltan Somogyi
zoltan.somogyi at runbox.com
Sat Aug 16 22:49:01 AEST 2025
On Sat, 16 Aug 2025 21:50:05 +1000, Julien Fischer <jfischer at opturion.com> wrote:
> On Sat, 16 Aug 2025 at 19:42, Zoltan Somogyi <zoltan.somogyi at runbox.com> wrote:
> >
> >
> > On Sat, 16 Aug 2025 14:41:51 +1000, Julien Fischer <jfischer at opturion.com> wrote:
> >
> > > On Sat, 16 Aug 2025 at 00:07, Zoltan Somogyi <zoltan.somogyi at runbox.com> wrote:
> > > >
> > > > For review by anyone whose uses .par grades.
> > > >
> > > > I specifically want to know: is my description MLDS .par grades correct?
> > >
> > > No, it isn't.
> > >
> > > > Are java.par and csharp.par actually different from
> > > > just java and csharp grades, and if so, how?
> > >
> > > .par has no meaning for the java and csharp grades. Those base grades support
> > > parallel multithreading directly.
> >
> > The compiler accepts java.par as well as java. If there is no difference between them,
> > then the compiler should reject the .par grade modifier as redundant in this case,
> > and for csharp as well. Do you agree?
>
> Yes, .par is redundant for C# and Java. (In fact,
Was something supposed to follow this?
> My understanding of the situation (which is not defence of it) is as follows:
>
> C does not provide builtin support for threads. One of the things that
> the .par component does (for both MLDS-C and LLDS grades) is provide the
> Mercury runtime and the generated code (through the runtime) access to
> C-level thread
> support (in practice, POSIX threads). This is what the MLDS-C and
> LLDS .par grades
> have in common. However, what is then done with that C-level thread
> support differs
> between the MLDS-C and LLDS backends.
>
> For the MLDS-C grades, the C-level thread support enabled by the .par component
> is used to enable support for concurrency (whether parallel or not).
> In the model of
> threading used by the MLDS-C .par grades, each Mercury thread is mapped onto a
> C-level thread. Those threads can execute in parallel, but do not
> have to (e.g. if
> you only have a single processor, then concurrency will be implemented
> using time
> slicing or somesuch.) This is the *only* way to get user-level concurrency in
> high-level C grades, thread.spawn/3 throws an exception in non .par hlc grades.
>
> For the LLDS .par grades, the C-level thread support is used to create
> a pool of C-level threads
> each of which runs a Mercury engine. Mercury threads are then
> multiplexed onto those
> engines in order to provide parallel concurrency. One of the other
> effects of the
> .par grade component in LLDS grades is to enable support for parallel
> conjunction
> in the compiler and runtime. Conjuncts from parallel conjunctions
> will also be executed
> on the engines running on the C-level threads.
>
> (You can, in principle, get non-parallel concurrency in non .par LLDS grades,
> but in practice that has never worked very well -- we might do better to get
> thread.spawn/3 to also throw an exception in those grades.)
>
> Finally, in both of the non-C grades support for target language-level
> threads is part
> of the language or standard library. The aspect of the .par grade that tells the
> runtime to use an external thread library is unnecessary for them. For
> both C# and Java,
> Mercury threads are mapped onto target language-level threads.
> Parallel conjunction is
> not supported.
Thanks for that info; it helps a lot.
> Installing asm_fast.par.gc and trying to run some of the samples in
> the concurrency
> directory should be sufficient. I'll install the asm_fast.par.gc
> grade and give it a try.
Thank you.
Zoltan.
More information about the reviews
mailing list