Fully transitive const is not necessary

Simen Kjaeraas simen.kjaras at gmail.com
Thu Apr 3 04:40:36 PDT 2008


On Thu, 03 Apr 2008 03:55:47 +0200, Bill Baxter  
<dnewsgroup at billbaxter.com> wrote:

> They can be run in parallel, as long as you don't stick non-pure  
> mutating operations in between them.
>
> That's quite useful for automatically parallelizing tight loops like  
> this:
>
> nosfx int foo(const C c) { return c.p[0]; }
> ...
>
> C[] array;
> ...// put bunch of C's in array
> int sum = 0;
> foreach(c; array) {
>     sum += foo(c);
> }
>
> Those foreach bodies could be run in parallel (with appropriate reduce  
> logic added to handling of 'sum' by compiler) since we know each call to  
> foo() in that loop has no external side effects.
>
> This is the kind of thing OpenMP lets you do with directives like  
> "#pragma pfor reduce".  Except I don't believe OpenMP has any way to  
> verify that foo() is really side-effect free.
>
> --bb


And could this not be done with real pure functions?

pure int foo(invariant C c) { return c.p[0];}

C[] array;
...// put bunch of C's in array
int sum = 0;
foreach(c; array) {
     sum += foo(cast(invariant)c);
}

We know that c will not change, so we can cast it to invariant.

--Simen



More information about the Digitalmars-d mailing list