Proposal: Relax rules for 'pure'

Robert Jacques sandford at jhu.edu
Mon Oct 25 20:47:22 PDT 2010


On Mon, 25 Oct 2010 09:44:14 -0400, Bruno Medeiros  
<brunodomedeiros+spam at com.gmail> wrote:

> On 23/09/2010 23:39, Robert Jacques wrote:
>> On Thu, 23 Sep 2010 16:35:23 -0400, Tomek Sowiński <just at ask.me> wrote:
>>>
>>> On topic: this means a pure function can take a reference to data that
>>> can be mutated by
>>> someone else. So we're giving up on the "can parallelize with no
>>> dataraces" guarantee on
>>> pure functions?
>>>
>>
>> In short, No. In long; the proposal is for pure functions become broken
>> up into two groups (weak and strong) based on their function signatures.
>> This division is internal to the compiler, and isn't expressed in the
>> language in any way. Strongly-pure functions provide all the guarantees
>> that pure does today and can be automatically parallelized or cached
>> without consequence. Weakly-pure functions, don't provide either of
>> these guarantees, but allow a much larger number of functions to be
>> strongly-pure. In order to guarantee a function is strongly pure, one
>> would have to declare all its inputs immutable or use an appropriate
>> template constraint.
>
> I think we need to be more realistic with what kinds of optimizations
> we could expect from a D compiler and pure functions.
> Caching might be done, but only a temporary sense (caching under a  
> limited execution scope). I doubt we would ever have something like  
> memoization, which would incur memory costs (potentially quite big  
> ones), and so the compiler almost certainly would not be able to know  
> (without additional metadata/anotations or compile options) if that  
> trade-off is acceptable.
>
> Similarly for parallelism, how would the compiler know that it's ok to  
> spawn 10 or 100 new threads to parallelize the execution of some loop?
> The consequences for program and whole-machine scheduling would not be  
> trivial and easy to understand. For this to happen, amongst other things  
> the compiler and OS would need to ensure that the spawned threads would  
> not starve the rest of the threads of that program.
> I suspect all these considerations might be very difficult to guarantee  
> on a non-VM environment.
>

Ahem, it's trivial for the compiler to know if it's okay to spawn 10 or  
100 _tasks_. Tasks, as opposed to threads or even thread pools, are  
extremely cheap (think on the order of function call overhead).


More information about the Digitalmars-d mailing list