From: "Randy Brukardt" <randy@rrsoftware.com>
Subject: Re: Real tasking problems with Ada.
Date: Mon, 31 Jul 2017 23:41:58 -0500
Date: 2017-07-31T23:41:58-05:00 [thread overview]
Message-ID: <olp0qn$ua6$1@franka.jacob-sparre.dk> (raw)
In-Reply-To: 9e51f87c-3b54-4d09-b9ca-e3c6a6e8940a@googlegroups.com
"Robert Eachus" <rieachus@comcast.net> wrote in message
news:9e51f87c-3b54-4d09-b9ca-e3c6a6e8940a@googlegroups.com...
> First, it should be possible to assign tasks in arrays to CPUs.
Use a discriminant of type CPU and (in Ada 2020) an
iterated_component_association. (This was suggested way back in Ada 9x, left
out in the infamous "scope reduction", and then forgotten about until 2013.
See AI12-0061-1 or the draft RM
http://www.ada-auth.org/standards/2xaarm/html/AA-4-3-3.html).
...
>1) Add a function Current_CPU or whatever (to System.Multiprocessors) that
> returns the identity of the CPU this task is running on. Obviously in a
> rendezvous
> with a protected object, the function would return the ID of the caller.
Why do you say this? Ada doesn't require the task that calls a protected
object to execute it (the execution can be handdled by the task that
services the barriers - I don't know if any implementation actually does
this, but the language rules are written to allow it).
> Probably do the same thing in a rendezvous between two tasks for
> consistency.
> Note that Get_ID function in System.Multiprocessors.Dispatching_Domains
> does that but it requires adding three (unnecessary) packages (DD,
> Ada.Real_Time, and Ada.Task_Identification) to your context without really
> using anything there.
Say what? You're using Get_Id, so clearly you're using something there.
Get_Id (like the rest of dispatching domains is likely to be expensive, so
you don't want it dragged into all programs. (And CPU is effectively part of
all programs.)
> 2) Allow a task to its CPU assignment after it has started execution. It
> is no big deal if a task starts on a different CPU than the one it will
> spend
> the rest of its life on. At a minimum Set_CPU(Current_CPU) or just
> Set_CPU should cause the task to be anchored to its current CPU core.
> Note that again you can do this with Dispatching_Domains.
So the capability already exists, but you don't like having to with an extra
package to use it? Have you lost your freaking mind? You want us to add
operations that ALREADY EXIST to another package, with all of the
compatibility problems that doing so would cause (especially for people that
had withed and used Dispatching_Domains)? When there are lots of problems
that can't be solved portably at all?
>Next, a huge problem. I just had some code churn out garbage while I was
>finding the
> "right" settings to get each chunk of work to have its own portion of an
> array. Don't tell
> me how to do this safely, if you do you are missing the point.
No, you're missing the point. Ada is about writing portable code. Nothing at
the level of "cache lines" is EVER going to be portable in any way. Either
one writes "safe" code and hopefully the compiler and runtime can take into
account the characteristics of the target. (Perhaps parallel loop constructs
will help with that.)
Or otherwise, one writes bleeding edge code that is not portable and not
safe. And you're on your own in such a case; no programming language could
possibly help you.
>A function Cache_Line_Size in System or System.Multiprocessors seems right.
No, it doesn't. It assumes a particular memory organization, and one thing
that's pretty clear is that whatever memory organization is common now will
not be common in a bunch of years. Besides, so many systems have multiple
layers of caches, that a single result won't be enough. And there is no way
for a general implementation to find this out (neither CPUs nor kernels
describe such information).
>Is adding these features to Ada worth the effort?
No way. They're much too low level, and they actually aren't enough to allow
parallelization. You want a language which allows fine-grained parallelism
from the start (like Parasail); trying to retrofit that on Ada (which is
mainly sequential, only having coarse parallelism) just will make a mess.
You might get a few problems solved (those using actual arrays, as opposed
to containers or user-defined types -- which one hopes are far more common
in today's programs), but there is nothing general, nor anything that fits
into Ada's building block approach, at the level that you're discussing.
Randy.
next prev parent reply other threads:[~2017-08-01 4:41 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-07-25 23:19 Real tasking problems with Ada Robert Eachus
2017-07-26 19:42 ` sbelmont700
2017-07-27 2:00 ` Robert Eachus
2017-08-01 4:45 ` Randy Brukardt
2017-08-02 2:23 ` Robert Eachus
2017-08-03 3:43 ` Randy Brukardt
2017-08-03 20:03 ` Robert Eachus
2017-08-03 23:10 ` Luke A. Guest
2017-08-04 23:22 ` Randy Brukardt
2017-08-22 5:10 ` Robert Eachus
2017-08-01 4:41 ` Randy Brukardt [this message]
2017-08-02 3:44 ` Robert Eachus
2017-08-02 14:39 ` Lucretia
2017-08-03 0:57 ` Robert Eachus
2017-08-03 5:43 ` Randy Brukardt
2017-08-03 1:33 ` Wesley Pan
2017-08-03 4:30 ` Randy Brukardt
2017-08-03 4:16 ` Randy Brukardt
2017-08-03 5:05 ` Niklas Holsti
2017-08-04 23:11 ` Randy Brukardt
2017-08-05 7:01 ` Niklas Holsti
2017-08-03 8:03 ` Simon Wright
2017-08-04 23:16 ` Randy Brukardt
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox