On Sunday, 10 January 2016 at 00:47:29 UTC, Ilya Yaroshenko wrote:
This is a bug in std.parallelism :-)

ok, thanks. I'm using your code and reduced it a bit. Looks like it has some interaction with executing vec.sum. If I substitute a simple assign of a double value, then all the values are updated in the parallel version also.


import std.algorithm;

double[1000] dvp;
double[1000] dv2;
double[] data;

void f1() {
    import std.parallelism;
    auto sla = new double[][1000];
    foreach(i, ref e; sla)
    {
        e = data[i * 100_000 .. (i+1) * 100_000];
    }

    // calculate sums in parallel
    foreach(i, vec; parallel(sla)){
        dvp[i] = vec.sum;
    }

    // calculate same values non-parallel
    foreach(i, vec; sla){
        dv2[i] = vec.sum;
    }
}

int main() {
    data = new double[100_000_000];
    for(int i=0;i<100_000_000;i++){ data[i] = i/100_000_000.0;}
    f1();

    // processed non-parallel works ok
    foreach( dv; dv2){
        if(dv != dv){ // test for NaN
            return 1;
        }
    }

    // calculated parallel leaves out processing of many values
    foreach( dv; dvp){
        if(dv != dv){ // test for NaN
            return 1;
        }
    }
    return(0);
}

Reply via email to