comp.lang.ada
 help / color / mirror / Atom feed
From: "Dmitry A. Kazakov" <mailbox@dmitry-kazakov.de>
Subject: Re: RFC: Prototype for a user threading library in Ada
Date: Mon, 4 Jul 2016 09:44:15 +0200
Date: 2016-07-04T09:44:15+02:00	[thread overview]
Message-ID: <nld45h$17t7$1@gioia.aioe.org> (raw)
In-Reply-To: d379100e-03cc-4848-9d7a-bf66d59ad6e3@googlegroups.com

On 03/07/2016 23:15, Hadrien Grasland wrote:
> Le dimanche 3 juillet 2016 10:39:48 UTC+2, Dmitry A. Kazakov a écrit :
>> On 2016-07-03 09:42, Hadrien Grasland wrote:
>>> Le samedi 2 juillet 2016 23:14:30 UTC+2, Niklas Holsti a écrit :
>>
>>>> Moreover, in present Ada it seems to me that the only way to move
>>>> task-private data from one task to another is to send a copy of the data
>>>> from one task to the other. Copying data is often poison for performance.
>>>
>>> Cheaply moving data around is possible in any language that has heap
>>> allocation and pointers.
>>
>> That is the most expensive way doing it, and on top of that, it requires
>> shared memory (pool) and thus process-global interlocking. You arrived
>> at the starting point.
>
> Please define what you mean by expensive.

Any operation that blocks all CPUs.

> Whenever the hardware
> architecture allows for it, passing a pointer to a heap-allocated data
> block is almost always faster than deep-copying that data from one
> thread-private area of memory to another, as long as the data is large
> enough.

This might be true only for architectures of few cores and shared 
memory. A massively parallel or distributed system cannot be built this way.

>> BTW, when talking about asynchronous model, marshaling must be
>> asynchronous too. Another drawback of the method of doing that through
>> pointers is that it must be atomic = synchronous => you could not deal
>> with large objects, on-demand production models etc. And this is where
>> event-controlled model stop working, as it separates data from
>> data-related events. A proper abstraction must combine everything into
>> ADT objects.
>
> Indeed, I also agree that when an event is used to notify a listener
> that some piece of data has been produced, it is almost always better to
> combine together the event and the data block being produced in a single
> abstraction, a future.
>
> However, futures are less general than events. In runtimes that only
> have futures, like HPX, you cannot easily express the completion of
> procedural operations. You just end up with horrible hacks such as
> hpx::future<void> ("a future of nothing"). This is why I believe that
> events are best as a low-level layer, on top of which higher-level
> abstractions such as futures can be built.

The idea is make it looking like normal tasks and protected objects 
doing normal blocking operations on normal objects without exposing 
implementation details like events. We could still have events 
implemented through  protected objects.

>>> What is more difficult is to provide an easy to
>>> use syntax around it.
>>
>> Hmm, what is difficult about procedure call?
>
> Basically, it is best if producers and consumers do not actually
> manipulate raw pointers to the heap-allocated blocks.

In Ada parameter passing is up to the implementation (with some 
exceptions). So if by-reference is the most efficient method of 
parameter passing the compiler will choose it. That is why I see no 
problem with the syntax.

> Otherwise, there is always a risk of a producer retaining access to
> the produced block and later manipulating it in a racey fashion.

OK, the aliasing problem is always a problem.

> A better option is to have a system where at the point where a
> producer "emits" data, it loses access to the associated data block. Of
> course, this is impossible to achieve in a perfectly fool-proof way, but
> we can make it harder for developers to shoot themselves in the foot,
> using things like futures.

One method is passing a controlled handle to the shared 
reference-counted object. The handle is invalidated upon return to the 
producer so that it will not be able to access the target object after that.

Another method is reference-counted "transactional" objects. A mutator 
operation on the object looks at the reference count, if it is greater 
than 1, it copies the object, uses the copy, sets the handle to point to 
the copy upon return.

-- 
Regards,
Dmitry A. Kazakov
http://www.dmitry-kazakov.de


  reply	other threads:[~2016-07-04  7:44 UTC|newest]

Thread overview: 72+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-06-17  9:44 RFC: Prototype for a user threading library in Ada Hadrien Grasland
2016-06-17 16:18 ` Niklas Holsti
2016-06-17 16:46   ` Dmitry A. Kazakov
2016-06-18  8:16     ` Hadrien Grasland
2016-06-18  8:47       ` Dmitry A. Kazakov
2016-06-18  9:17         ` Hadrien Grasland
2016-06-18 11:53           ` Dmitry A. Kazakov
2016-06-20  8:23             ` Hadrien Grasland
2016-06-20  9:22               ` Dmitry A. Kazakov
2016-06-23  1:42       ` Randy Brukardt
2016-06-23  8:39         ` Dmitry A. Kazakov
2016-06-23 22:12           ` Randy Brukardt
2016-06-24  7:34             ` Dmitry A. Kazakov
2016-06-24 23:00               ` Randy Brukardt
2016-06-25  7:11                 ` Dmitry A. Kazakov
2016-06-26  2:02                   ` rieachus
2016-06-26  6:26                     ` Dmitry A. Kazakov
2016-06-24  0:38           ` rieachus
2016-06-25  6:28             ` Dmitry A. Kazakov
2016-06-26  1:34               ` rieachus
2016-06-26  3:21               ` Randy Brukardt
2016-06-26  6:15                 ` Dmitry A. Kazakov
2016-06-28 20:44                   ` Anh Vo
2016-07-02  4:13                   ` Randy Brukardt
2016-07-02 10:25                     ` Dmitry A. Kazakov
2016-07-05 21:53                       ` Randy Brukardt
2016-07-06  9:25                         ` Dmitry A. Kazakov
2016-07-07  0:32                           ` Randy Brukardt
2016-07-07  6:08                             ` Niklas Holsti
2016-07-08  0:03                               ` Randy Brukardt
2016-07-08  7:32                                 ` Dmitry A. Kazakov
2016-07-11 19:40                                   ` Randy Brukardt
2016-07-12  8:37                                     ` Dmitry A. Kazakov
2016-07-12 21:31                                       ` Randy Brukardt
2016-07-08 20:17                                 ` Niklas Holsti
2016-06-24 21:06         ` Hadrien Grasland
2016-06-26  3:09           ` Randy Brukardt
2016-06-26  6:41             ` Dmitry A. Kazakov
2016-07-02  4:21               ` Randy Brukardt
2016-07-02 10:33                 ` Dmitry A. Kazakov
2016-07-05 21:24                   ` Randy Brukardt
2016-07-06 13:46                     ` Dmitry A. Kazakov
2016-07-07  1:00                       ` Randy Brukardt
2016-07-07 14:23                         ` Dmitry A. Kazakov
2016-07-07 23:43                           ` Randy Brukardt
2016-07-08  8:23                             ` Dmitry A. Kazakov
2016-07-11 19:44                               ` Randy Brukardt
2016-06-26  9:09             ` Hadrien Grasland
2016-07-02  4:36               ` Randy Brukardt
2016-07-02  5:30                 ` Simon Wright
2016-07-05 21:29                   ` Randy Brukardt
2016-07-02 11:13                 ` Hadrien Grasland
2016-07-02 13:18                   ` Dmitry A. Kazakov
2016-07-02 16:49                     ` Hadrien Grasland
2016-07-02 21:33                       ` Niklas Holsti
2016-07-03 20:56                         ` Hadrien Grasland
2016-07-02 17:26                   ` Niklas Holsti
2016-07-02 21:14                   ` Niklas Holsti
2016-07-03  7:42                     ` Hadrien Grasland
2016-07-03  8:39                       ` Dmitry A. Kazakov
2016-07-03 21:15                         ` Hadrien Grasland
2016-07-04  7:44                           ` Dmitry A. Kazakov [this message]
2016-07-05 21:38                   ` Randy Brukardt
2016-06-21  2:40     ` rieachus
2016-06-21  7:34       ` Dmitry A. Kazakov
2016-06-18  7:56   ` Hadrien Grasland
2016-06-18  8:33 ` Hadrien Grasland
2016-06-18 11:38 ` Hadrien Grasland
2016-06-18 13:17   ` Niklas Holsti
2016-06-18 16:27   ` Jeffrey R. Carter
2016-06-20  8:42 ` Hadrien Grasland
2016-07-10  0:45 ` rieachus
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox