2D array parallelism
Andrew Klaassen
clawsoon at yahoo.com
Sun Jan 26 09:10:23 PST 2014
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
More information about the Digitalmars-d-learn
mailing list