Hi, Rafael,
Thanks for your reply. I inlined my comments below:
I’ve been talking to Rafael Larrosa regarding the issue you are reporting. He
has conducted some experiments with your code on Titan (Cray XK7 at ORNL, which
features Cray Gemini interconnect) and there are no communication problem
there. However, we have here in Malaga a cluster based on Infiniband
(ibv-conduit) and the execution fails on that platform. I’ve also confirmed
that udp-conduit does not pose any problem.
I really appreciate your and Rafael Larrosa's experiments. I'm glad to hear
that this is not a problem in Chapel compiler.
Rafael Larrosa told me that he faced the same issue last month and that after
spending more than two weeks tackling the problem he is almost sure that there
is a bug (or a maximum buffer size limitation) in the ibv-conduit
implementation of gasnet. For his code, he found a turning point when the
transferred buffer was 128MBytes: smaller communications work fine, but larger
always fail. He says it was tricky, because when you try to isolate the problem
(i.e. isolate the particular transfer that fails by executing just this single
communication) then the problem vanish. So it will be challenging to chase this
bug.
Sure, now I understand there is a bug in the ibv-conduit implementation of
gasnet. and yes, It seems fixing the bug is very difficult. Actually, an
original benchmark I want to run spawns many tasks by begin statement and each
task does bulk transfer. I can imagine the benchmark exceeds some limit like
Rafael's code. I'm also wondering why the simplified code has this problem.
There might be another problem.
You may want to circumvent the bug by:
1.- Not using bulkComms optimization (-suseBulkTransferStride=false
-suseBulkTransfer=false). —> Slower comms.
2.- Implementing a version of bulkComms that splits big messages into smaller
ones. —> wearisome tinkering
3.- Avoid ibv-conduit —> 207 out of the 500 supercomputers in latest top500
list are based on ibv
4.- Dive into the ibv-conduit implementation —> Probably not your main research
goal
For the time being we are conducting all our experiments on Cray machines, so
we do not plan (and do not have time) to tackle 2 or 4, so we are getting by
with 3.
Exactly, 4 is not my research goal, I 'd choose 3 if a benchmark I would like
to run use bulk transfer. Thanks for your suggestions.
If Rafael wants to chime in, he can probably give you more details and advices,
should you want to debug your code at a lower level.
I would appreciate if he could give me more details. I think I should mention
the bug in my paper or something.
Best,
Akihiro
On Jan 29, 2014, at 4:46 AM, Rafael Asenjo Plaza wrote:
Hi Akihiro,
I’ve been talking to Rafael Larrosa regarding the issue you are reporting. He
has conducted some experiments with your code on Titan (Cray XK7 at ORNL, which
features Cray Gemini interconnect) and there are no communication problem
there. However, we have here in Malaga a cluster based on Infiniband
(ibv-conduit) and the execution fails on that platform. I’ve also confirmed
that udp-conduit does not pose any problem.
Rafael Larrosa told me that he faced the same issue last month and that after
spending more than two weeks tackling the problem he is almost sure that there
is a bug (or a maximum buffer size limitation) in the ibv-conduit
implementation of gasnet. For his code, he found a turning point when the
transferred buffer was 128MBytes: smaller communications work fine, but larger
always fail. He says it was tricky, because when you try to isolate the problem
(i.e. isolate the particular transfer that fails by executing just this single
communication) then the problem vanish. So it will be challenging to chase this
bug.
You may want to circumvent the bug by:
1.- Not using bulkComms optimization (-suseBulkTransferStride=false
-suseBulkTransfer=false). —> Slower comms.
2.- Implementing a version of bulkComms that splits big messages into smaller
ones. —> wearisome tinkering
3.- Avoid ibv-conduit —> 207 out of the 500 supercomputers in latest top500
list are based on ibv
4.- Dive into the ibv-conduit implementation —> Probably not your main research
goal
For the time being we are conducting all our experiments on Cray machines, so
we do not plan (and do not have time) to tackle 2 or 4, so we are getting by
with 3.
If Rafael wants to chime in, he can probably give you more details and advices,
should you want to debug your code at a lower level.
Regards,
Rafa.
El 28/01/2014, a las 19:31, Akihiro Hayashi <[email protected]> escribió:
Hi, Rafael,
Sorry for the delayed reply.
Let me share the program that reproduces the problem. (attached below)
As you can see, the program prints "INVALID? : true" if we get bulk copy transfer error,
otherwise it prints "INVALID?: false".
I get the error when I run the program on 2 locales with ibv-conduit
(mpi-spawner). The input data size is : matrixSize = 2000 and tileSize = 200.
Please let me know if you want the input file.
Note that I don't get the error when I run the program on 1 locale. In
addition, I don't get the error with smaller data size even on 2 or more
locales (e.g 10x10 matrix and 2x2 tile size).
I'm guessing using ibv-conduit and transferring a certain amount of data incurs
this problem.
FYI, using udp-conduit (amudprun) does not show the error.
Please let me know if you have any comments and questions.
Best,
Akihiro
--
use BlockDist;
config const matrixSize: int(32) = -1;
config const tileSize: int(32) = -1;
config const inFile: string = "m_2000.in";
const zero: int(32) = 0;
var tile_array_indices = {zero..tileSize-1,zero..tileSize-1};
class Tile {
var tile_array: [tile_array_indices] real;
}
proc read_2D_array ( fileName: string, matrixSize: int(32) ) {
var input_stream = open (fileName, iomode.r);
var reader = input_stream.reader();
var matrix_index_2D = {0..matrixSize-1, 0..matrixSize-1};
var array: [matrix_index_2D] real;
for ij in matrix_index_2D do {
reader.read(array(ij));
}
input_stream.close();
reader.close();
// if (debug) { writeln("whole array: ",array); }
return array;
}
proc main(): void {
writeln("numLocales : ", numLocales);
var numTiles: int(32) = matrixSize/tileSize;
var numTiles_2: int(64) = matrixSize/tileSize;
var whole_array = read_2D_array(inFile, matrixSize);
var proto_ijk_space = {zero..numTiles_2-1, zero..numTiles_2, zero..numTiles_2};
var ijk_space = proto_ijk_space dmapped Block(boundingBox=proto_ijk_space);
var lkji_tiles: [ijk_space] Tile;
for i in zero..numTiles-1 do {
for j in zero..i do {
on lkji_tiles(i,j,zero).locale do {
var curr_tile: Tile = new Tile();
for (ii,jj) in tile_array_indices do {
curr_tile.tile_array(ii,jj) =
whole_array(i*tileSize+ii,j*tileSize+jj);
}
lkji_tiles(i,j,zero) = curr_tile;
}
}
}
var invalid : bool = false;
for i in zero..numTiles-1 do {
for iB in zero..tileSize-1 do {
for j in zero..i do {
var temp = lkji_tiles(i,j,zero).tile_array;
if(i != j) {
for jB in zero..tileSize-1 do {
if (temp(iB,jB) != lkji_tiles(i, j,
zero).tile_array(iB, jB)) {
invalid = true;
}
}
} else {
for jB in zero..iB do {
if (temp(iB,jB) != lkji_tiles(i, j,
zero).tile_array(iB, jB)) {
invalid = true;
}
}
}
}
}
}
writeln("INVALID? : ", invalid);
}
On Jan 22, 2014, at 1:46 PM, Akihiro Hayashi wrote:
Hi Rafael,
Thanks for your reply.
I inlined my comments below:
May we have a simplified copy of your code (kinda the snippet provided below
but with initial values for tileSize, numTiles_2, k, etc. i.e. something that
compiles) so that we can also give it a go?
Yes, it would be better if we can have a simplified code.
Actually, I have been trying to make a simple code that reproduce this problem
for several weeks. finally I managed to make it this morning.
Let me ask my advisor if we can show you the code.
Would you like to try also with these flags?:
-suseBulkTransferStride=true -suseBulkTransfer=false
I tried these flags, but I still get the error.
I'll keep you updated.
Best,
Akihiro
On Jan 22, 2014, at 5:23 AM, Rafael Asenjo Plaza wrote:
Hi Akihiro,
May we have a simplified copy of your code (kinda the snippet provided below
but with initial values for tileSize, numTiles_2, k, etc. i.e. something that
compiles) so that we can also give it a go?
Would you like to try also with these flags?:
-suseBulkTransferStride=true -suseBulkTransfer=false
Thank you,
Rafa.
El 21/01/2014, a las 18:33, Akihiro Hayashi <[email protected]> escribió:
Dear Chapel developers,
This is Akihiro Hayashi, postdoc at Rice University.
I'm writing this to ask array copy failure in chapel.
I'm trying to evaluate some chapel benchmark across multiple nodes but I get
strange error.
Please note that I'm using old version of chapel compiler (r21945) with
qthread-1.10 and GASNet-1.20.2(infiniband-conduit, mpi-spawner) because the
latest version does not work.
With the latest version of chapel compiler (r22568) with qthread-1.10 and
GASNet-1.22.0(infiniband-conduit, mpi-spawner), I get SEGV when running simple
program (coforall loc in Locales do on loc { writeln(loc); }) across multiple
nodes with mpi spawner.
This is another problem but I have not investigated this problem yet. I'll work
on this later.
The following problem might be fixed in the latest version, but any comments
and suggestions are appreciated.
Here is part of my code.
The main data structure is a 3-dimensional array, which is declared as a
distributed array that each of its element refers to a 2-dimension array.
You can see array copy statement (liBlock = lkji_tiles(k,k,k+1).tile_array;) in
Line 11. I want to use this copy statement because the Chapel compiler
generates bulk transfer code, which accelerates program execution.
// Code
1: const zero: int(32) = 0;
2: var tile_array_indices = {zero..tileSize-1,zero..tileSize-1};
3: class Tile {
4: var tile_array: [tile_array_indices] real;
5: }
6: var proto_ijk_space = {zero..numTiles_2-1, zero..numTiles_2,
zero..numTiles_2};
7: var ijk_space = proto_ijk_space dmapped Block(boundingBox=proto_ijk_space);
8: var lkji_tiles: [ijk_space] Tile;
...
9 :begin {
...
10: var liBlock: [tile_array_indices] real;
11: liBlock = lkji_tiles(k,k,k+1).tile_array;
12: for (m,n) in tile_array_indices {
13: if (liBlock(m,n) != lkji_tiles(k,k,k+1).tile_array(m,n)) {
14: invalid = true;
15: }
16: }
17: if (invalid) { writln("Copy Failed");}
18: ...
19: }
...
In my experiment, when running the program on 2 or more locales, the program prints "Copy
Failed" which means "liBlock = lkji_tiles(k,k,k+1).tile_array;" in Line 11 failed.
This happens sometime (not always). and I confirmed the copy is successfully
done if I replace the array copy in Line 11 with copy loop.
Additionally, I also see the same behavior when I replace the array copy in
Line 11 with liBlock._value.doiBulkTransfer(lkji_tiles(k,k,k+1).tile_array);.
Here is an output log at runtime when I compile the program with -s
debugBulkTransfer (tileSize=200):
-- Log starts here
In DefaultRectangularArr.doiBulkTransfer(): Alo=(0, 0), Blo=(0, 0), len=40000,
elemSize=8;
-- End of Log
In both cases, the runtime internally calls chpl_comm_get API(*) and the API
takes the above parameters.
I think it looks good.
(*) Please take a look at doiBulkTransfer function in
CHPL_HOME/modules/internal/DefaultRectangular.chpl
Any comments and suggestions are appreciated.
Best regards,
Akihiro
------------------------------------------------------------------------------
CenturyLink Cloud: The Leader in Enterprise Cloud Services.
Learn Why More Businesses Are Choosing CenturyLink Cloud For
Critical Workloads, Development Environments & Everything In Between.
Get a Quote or Start a Free Trial Today.
http://pubads.g.doubleclick.net/gampad/clk?id=119420431&iu=/4140/ostg.clktrk
_______________________________________________
Chapel-developers mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/chapel-developers
__
Rafael Asenjo Plaza
Dept. Arquitectura de Computadores
Complejo Tecnologico Campus de Teatinos
E-29071 MALAGA (SPAIN)
Tel: +34 95 213 27 91
Fax: +34 95 213 27 90
http://www.ac.uma.es/~asenjo
__
Rafael Asenjo Plaza
Dept. Arquitectura de Computadores
Complejo Tecnologico Campus de Teatinos
E-29071 MALAGA (SPAIN)
Tel: +34 95 213 27 91
Fax: +34 95 213 27 90
http://www.ac.uma.es/~asenjo
------------------------------------------------------------------------------
WatchGuard Dimension instantly turns raw network data into actionable
security intelligence. It gives you real-time visual feedback on key
security issues and trends. Skip the complicated setup - simply import
a virtual appliance and go from zero to informed in seconds.
http://pubads.g.doubleclick.net/gampad/clk?id=123612991&iu=/4140/ostg.clktrk
_______________________________________________
Chapel-developers mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/chapel-developers