www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - 2D array parallelism

reply "Andrew Klaassen" <clawsoon yahoo.com> writes:
I've got some code which sets values in a 2D array.  Each value 
is independent, so I'm using std.parallelism to set the values a 
row at a time.  When my variables are class variables it seems to 
work (though it's hard to tell, given that the effect is 
intermittent), but when I use module-level variables, all the 
values in some rows are occasionally left as all nan on a 
multicore machine.

Here's a minimal illustration of what I'm seeing:


import io = std.stdio;
import pll = std.parallelism;

long width;
long height;
double[][] payoffs;

void calculate() {
   foreach (y, ref row; pll.taskPool.parallel(payoffs)) {
     io.writef("%s ", y);
     for (auto x=0; x<width; x++) {
       row[x] = 0.0;
     }
   }
   io.writeln();

   for (auto y=0; y<height; y++) {
     for (auto x=0; x<width; x++) {
       io.writef("%s ", payoffs[y][x]);
     }
     io.writeln();
   }
}

void main(string[] args) {
   width = 20;
   height = 20;
   payoffs = new double[][](height, width);
   calculate();

}


Here's a sample output:

0 2 4 3 6 7 8 5 10 11 12 13 14 15 16 17 9 19 1 18
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 
nan nan nan nan
nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 
nan nan nan nan
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 
nan nan nan nan
nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 
nan nan nan nan
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 
nan nan nan nan
nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 
nan nan nan nan
nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 
nan nan nan nan
nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 
nan nan nan nan
nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 
nan nan nan nan
nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 
nan nan nan nan
nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 
nan nan nan nan
nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 
nan nan nan nan
nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 
nan nan nan nan
nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 
nan nan nan nan


This happens with dmd, ldc2 and gdc, so I assume it's something 
I'm doing wrong rather than a bug.  What's the explanation?  What 
am I doing wrong?

Thanks.

Andrew
Jan 26 2014
parent reply "bearophile" <bearophileHUGS lycos.com> writes:
Andrew Klaassen:

 This happens with dmd, ldc2 and gdc, so I assume it's something 
 I'm doing wrong rather than a bug.  What's the explanation?  
 What am I doing wrong?
Do you know that module level variables in D are thread-local? If you don't what that, you have to use __gshared. Bye, bearophile
Jan 26 2014
parent "Andrew Klaassen" <clawsoon yahoo.com> writes:
On Sunday, 26 January 2014 at 20:34:27 UTC, bearophile wrote:

 Do you know that module level variables in D are thread-local? 
 If you don't what that, you have to use __gshared.

 Bye,
 bearophile
Perfect, thanks! If anyone wants to make things easy on stupid people like me, using a module level variable inside a parallel foreach like I was could generate a compiler warning. Not that I'm smart enough to implement something like that. :-) Andrew
Jan 26 2014