10 #define _XOPEN_SOURCE 700 21 #include "partest_split_comm.h" 22 #include "partest_util.h" 25 #include <firmware/include/personality.h> 26 #include <spi/include/kernel/process.h> 27 #include <spi/include/kernel/location.h> 29 #include <hwi/include/bqc/A2_inlines.h> 31 #include <hwi/include/common/uci.h> 36 #include <common/bgp_personality.h> 37 #include <common/bgp_personality_inlines.h> 53 int split_communicator(
_test_communicators * communicators,
int bluegene,
int bluegene_np,
int bluegene_sort,
int numfiles,
int read_task_offset,
int verbose)
57 communicators->work_size = communicators->work_rank = -2;
58 communicators->local_size = communicators->local_rank = -2;
64 _BGP_Personality_t personality;
65 MPI_Comm commSame, commDiff;
66 int sizeSame, sizeDiff;
67 int rankSame, rankDiff;
69 unsigned procid, x, y, z, t;
70 char cbuffer[MAXCHARLEN];
73 Kernel_GetPersonality(&personality,
sizeof(personality));
74 BGP_Personality_getLocationString(&personality, location);
75 procid = Kernel_PhysicalProcessorID();
76 MPIX_rank2torus(communicators->all_rank, &x, &y, &z, &t);
79 MPIX_Pset_diff_comm_create(&commDiff);
80 MPI_Comm_size(commDiff, &sizeDiff);
81 MPI_Comm_rank(commDiff, &rankDiff);
82 communicators->ionode_number = rankDiff;
85 MPIX_Pset_same_comm_create(&commSame);
86 MPI_Comm_size(commSame, &sizeSame);
87 MPI_Comm_rank(commSame, &rankSame);
90 if (bluegene_np == 0) {
91 bluegene_np = sizeSame;
95 MPI_Comm_split(communicators->
all, (rankSame < bluegene_np), communicators->all_rank, &communicators->
work);
96 MPI_Comm_size(communicators->
work, &communicators->work_size);
97 MPI_Comm_rank(communicators->
work, &communicators->work_rank);
98 if (rankSame >= bluegene_np) {
100 communicators->work_size = communicators->work_rank = -1;
101 communicators->local_size = communicators->local_rank = -1;
107 communicators->
local = communicators->
work;
109 else if(numfiles<0) {
112 MPI_Comm_split(commSame, (rankSame < bluegene_np), communicators->all_rank, &communicators->
local);
116 communicators->
local=commDiff;
119 MPI_Comm_size(communicators->
local, &communicators->local_size);
120 MPI_Comm_rank(communicators->
local, &communicators->local_rank);
125 if(numfiles==-1) communicators->file_number = rankDiff;
126 else communicators->file_number = rankSame;
129 communicators->file_number = -1;
133 sprintf(cbuffer,
"");
134 if (rankSame < bluegene_np) {
136 sprintf(cbuffer,
"BGP[%05d] diff_comm: %4d of %4d same_comm: %5d of %5d file_comm: %5d of %5d %s phys_xyzt(%ud,%ud,%ud,%ud)\n",
137 communicators->all_rank, rankDiff + 1, sizeDiff, rankSame + 1, sizeSame, communicators->local_rank + 1, communicators->local_size,
138 location, x, y, z, t);
141 collective_print_gather(cbuffer, communicators->
work);
148 Personality_t personality;
149 MPI_Comm commSame, commDiff;
151 int sizeSame, sizeDiff;
152 int rankSame, rankDiff;
154 int factor, bridgeid,core, hwthread,procid;
155 int dist_to_bridge, isonbridge;
156 char cbuffer[MAXCHARLEN];
158 BG_UniversalComponentIdentifier uci;
159 unsigned int row, col, mp, nb, cc;
161 int key, color, baseid;
163 if(communicators->all_rank==0) {
164 starttime=MPI_Wtime();
165 printf(
"partest_split_comm[%d]: starting at Wt=%10.3fs\n",communicators->all_rank,starttime);
169 Kernel_GetPersonality(&personality,
sizeof(Personality_t));
171 uci = personality.Kernel_Config.UCI;
172 bg_decodeComputeCardOnNodeBoardUCI(uci, &row, &col, &mp, &nb, &cc);
174 procid = Kernel_ProcessorID();
175 core = Kernel_ProcessorCoreID();
176 hwthread = Kernel_ProcessorThreadID();
178 sprintf(location,
"R%x%x-M%ud-N%02x-J%02x <%d,%d,%d,%d,%d> p%02dc%02dt%1d", row, col, mp, nb, cc,
179 personality.Network_Config.Acoord, personality.Network_Config.Bcoord,
180 personality.Network_Config.Ccoord, personality.Network_Config.Dcoord,
181 personality.Network_Config.Ecoord,
182 procid,core,hwthread);
185 ( personality.Network_Config.Acoord==personality.Network_Config.cnBridge_A ) &&
186 ( personality.Network_Config.Bcoord==personality.Network_Config.cnBridge_B ) &&
187 ( personality.Network_Config.Ccoord==personality.Network_Config.cnBridge_C ) &&
188 ( personality.Network_Config.Dcoord==personality.Network_Config.cnBridge_D ) &&
189 ( personality.Network_Config.Ecoord==personality.Network_Config.cnBridge_E )
197 dist_to_bridge=MPIX_IO_distance();
201 bridgeid = personality.Network_Config.cnBridge_E;
202 factor *= personality.Network_Config.Enodes;
203 bridgeid += personality.Network_Config.cnBridge_D*factor;
204 factor *= personality.Network_Config.Dnodes;
205 bridgeid += personality.Network_Config.cnBridge_C*factor;
206 factor *= personality.Network_Config.Cnodes;
207 bridgeid += personality.Network_Config.cnBridge_B*factor;
208 factor *= personality.Network_Config.Bnodes;
209 bridgeid += personality.Network_Config.cnBridge_A*factor;
215 if(bluegene_sort==0) {
216 key = MPIX_IO_distance();
218 key = communicators->all_rank;
221 MPI_Comm_split(communicators->
all, bridgeid, key, &commSame);
222 MPI_Comm_size(commSame, &sizeSame);
223 MPI_Comm_rank(commSame, &rankSame);
227 MPI_Comm_split(communicators->
all, rankSame, bridgeid, &commDiff);
228 MPI_Comm_size(commDiff, &sizeDiff);
229 MPI_Comm_rank(commDiff, &rankDiff);
231 communicators->ionode_number = rankDiff;
234 MPI_Comm commSameIOB;
240 key = communicators->all_rank;
241 MPI_Comm_split(communicators->
all, bridgeid, key, &commSameIOB);
242 MPI_Comm_size(commSameIOB, &sizeSameIOB);
243 MPI_Comm_rank(commSameIOB, &rankSameIOB);
245 if(communicators->all_rank==0) {
246 printf(
"partest_split_comm[%d]: after split commSameIOB deltaWt=%10.3fs\n",communicators->all_rank,MPI_Wtime()-starttime);
251 ionid=MPIX_IO_node_id();
253 MPI_Bcast(&ionid, 1, MPI_INT, 0, commSameIOB);
255 if(communicators->all_rank==0) {
256 printf(
"partest_split_comm[%d]: after get ionid deltaWt=%10.3fs\n",communicators->all_rank,MPI_Wtime()-starttime);
260 if(bluegene_sort==0) {
261 key = MPIX_IO_distance();
263 key = communicators->all_rank;
266 rc=MPI_Comm_split(communicators->
all,color,key,&commSame);
267 MPI_Comm_size(commSame, &sizeSame);
268 MPI_Comm_rank(commSame, &rankSame);
271 if(communicators->all_rank==0) {
272 printf(
"partest_split_comm[%d]: after split commSame deltaWt=%10.3fs\n",communicators->all_rank,MPI_Wtime()-starttime);
276 if(rankSame==0) baserank=communicators->all_rank;
277 MPI_Bcast(&baserank, 1, MPI_INT, 0, commSame);
279 if(communicators->all_rank==0) {
280 printf(
"partest_split_comm[%d]: after bcast baserank deltaWt=%10.3fs\n",communicators->all_rank,MPI_Wtime()-starttime);
286 MPI_Comm_split(communicators->
all,color,key,&commDiff);
287 MPI_Comm_size(commDiff, &sizeDiff);
288 MPI_Comm_rank(commDiff, &rankDiff);
290 if(communicators->all_rank==0) {
291 printf(
"partest_split_comm[%d]: after split commDiff deltaWt=%10.3fs\n",communicators->all_rank,MPI_Wtime()-starttime);
300 if (bluegene_np == 0) {
301 bluegene_np = sizeSame;
306 MPI_Comm_split(communicators->
all, (rankSame < bluegene_np), communicators->all_rank, &communicators->
work);
307 MPI_Comm_size(communicators->
work, &communicators->work_size);
308 MPI_Comm_rank(communicators->
work, &communicators->work_rank);
309 if (rankSame >= bluegene_np) {
311 communicators->work_size = communicators->work_rank = -1;
312 communicators->local_size = communicators->local_rank = -1;
314 if(communicators->all_rank==0) {
315 printf(
"partest_split_comm[%d]: after split work deltaWt=%10.3fs\n",communicators->all_rank,MPI_Wtime()-starttime);
321 communicators->
local = communicators->
work;
323 else if(numfiles<0) {
327 MPI_Comm_split(commSame, (rankSame < bluegene_np), rankSame, &communicators->
local);
330 color=(rankSame < bluegene_np)?baseid:MPI_UNDEFINED;
331 MPI_Comm_split(communicators->
all, color, rankSame, &communicators->
local);
333 if (rankSame < bluegene_np) {
334 MPI_Comm_size(communicators->
local, &communicators->local_size);
335 MPI_Comm_rank(communicators->
local, &communicators->local_rank);
338 if(communicators->all_rank==0) {
339 printf(
"partest_split_comm[%d]: after split local deltaWt=%10.3fs\n",communicators->all_rank,MPI_Wtime()-starttime);
345 communicators->
local=commDiff;
346 MPI_Comm_size(communicators->
local, &communicators->local_size);
347 MPI_Comm_rank(communicators->
local, &communicators->local_rank);
354 if(numfiles==-1) communicators->file_number = rankDiff;
355 else communicators->file_number = rankSame;
358 communicators->file_number = -1;
361 if(communicators->all_rank==0) {
362 printf(
"partest_split_comm[%d]: before print verbose deltaWt=%10.3fs\n",communicators->all_rank,MPI_Wtime()-starttime);
366 sprintf(cbuffer,
"");
367 if (rankSame < bluegene_np) {
368 sprintf(cbuffer,
"BGQ[%05d] diff_comm: %4d of %4d same_comm: %5d of %5d file_comm: %5d of %5d %s bridge=%d, dist=%d\n",
369 communicators->all_rank, rankDiff + 1, sizeDiff, rankSame + 1, sizeSame, communicators->local_rank + 1,
370 communicators->local_size, location,isonbridge,dist_to_bridge);
372 collective_print_gather(cbuffer, communicators->
work);
374 if(communicators->all_rank==0) {
375 printf(
"partest_split_comm[%d]: after print verbose/end deltaWt=%10.3fs\n",communicators->all_rank,MPI_Wtime()-starttime);
388 gethostname(location, 256);
389 char cbuffer[MAXCHARLEN];
390 sprintf(cbuffer,
"DARWIN[%03d] diff_comm: %4d of %4d same_comm: %4d of %4d file_comm: %4d of %4d %s\n",
391 communicators->all_rank, communicators->all_rank, communicators->all_size,
392 communicators->work_rank, communicators->work_size, communicators->local_rank, communicators->local_size, location);
393 collective_print_gather(cbuffer, communicators->
all);
398 #if defined( _SION_LINUX) && (!defined(_SION_FX)) 401 gethostname(location, 256);
402 char cbuffer[MAXCHARLEN];
403 sprintf(cbuffer,
"LINUX[%03d] diff_comm: %4d of %4d same_comm: %4d of %4d file_comm: %4d of %4d %s\n",
404 communicators->all_rank, communicators->all_rank, communicators->all_size,
405 communicators->work_rank, communicators->work_size, communicators->local_rank, communicators->local_size, location);
406 collective_print_gather(cbuffer, communicators->
all);
414 gethostname(location, 256);
415 int sizeSame = 0, sizeDiff = 0;
416 char cbuffer[MAXCHARLEN];
417 sprintf(cbuffer,
"AIX[%03d] diff_comm: %4d of %4d same_comm: %4d of %4d file_comm: %4d of %4d %s\n",
418 communicators->all_rank, communicators->all_rank, communicators->all_size,
419 communicators->work_rank, communicators->work_size, communicators->local_rank, communicators->local_size, location);
420 collective_print_gather(cbuffer, communicators->
all);
427 int rank, x, y, z, a, b, c, rc;
429 char cbuffer[MAXCHARLEN];
431 MPI_Comm commSame, commDiff;
432 int sizeSame = 0, sizeDiff;
433 int rankSame = 0, rankDiff;
435 gethostname(location, 256);
436 MPI_Comm_rank(MPI_COMM_WORLD, &rank);
437 rc=FJMPI_Topology_sys_rank2xyzabc(rank, &x, &y, &z, &a, &b, &c);
439 ionodeid=x * 65536 + y;
444 MPI_Comm_split(communicators->
all, ionodeid, communicators->all_rank, &commSame);
445 MPI_Comm_size(commSame, &sizeSame);
446 MPI_Comm_rank(commSame, &rankSame);
449 MPI_Comm_split(communicators->
all, rankSame, ionodeid, &commDiff);
450 MPI_Comm_size(commDiff, &sizeDiff);
451 MPI_Comm_rank(commDiff, &rankDiff);
453 communicators->ionode_number = rankDiff;
456 bluegene_np = sizeSame;
460 MPI_Comm_split(communicators->
all, (rankSame < bluegene_np), communicators->all_rank, &communicators->
work);
461 MPI_Comm_size(communicators->
work, &communicators->work_size);
462 MPI_Comm_rank(communicators->
work, &communicators->work_rank);
463 if (rankSame >= bluegene_np) {
465 communicators->work_size = communicators->work_rank = -1;
466 communicators->local_size = communicators->local_rank = -1;
472 communicators->
local = communicators->
work;
474 else if(numfiles<0) {
477 MPI_Comm_split(commSame, (rankSame < bluegene_np), communicators->all_rank, &communicators->
local);
481 communicators->
local=commDiff;
484 MPI_Comm_size(communicators->
local, &communicators->local_size);
485 MPI_Comm_rank(communicators->
local, &communicators->local_rank);
490 if(numfiles==-1) communicators->file_number = rankDiff;
491 else communicators->file_number = rankSame;
494 communicators->file_number = -1;
498 sprintf(cbuffer,
"");
499 if (rankSame < bluegene_np) {
500 sprintf(cbuffer,
"FX[%03d] diff_comm: %4d of %4d same_comm: %4d of %4d file_comm: %4d of %4d %dx%dx%d %dx%dx%d %s ioid=%d ion=%d rc=%d numfiles=%d\n",
502 communicators->all_rank, rankDiff, sizeDiff, rankSame, sizeSame,
503 communicators->local_rank, communicators->local_size,
504 x,y,z,a,b,c, location, ionodeid, communicators->ionode_number, rc, numfiles);
506 collective_print_gather(cbuffer, communicators->
all);
513 if (communicators->work_size == -2) {
515 communicators->
work = communicators->
all;
516 MPI_Comm_size(communicators->
work, &communicators->work_size);
517 MPI_Comm_rank(communicators->
work, &communicators->work_rank);
520 if (communicators->local_size == -2) {
522 communicators->
local = communicators->
work;
526 numfiles = communicators->work_size / 2;
530 proc_per_file = communicators->work_size / numfiles;
533 if (communicators->work_rank >= (numfiles * proc_per_file)) {
534 communicators->file_number = numfiles - 1;
537 communicators->file_number = communicators->work_rank / proc_per_file;
540 MPI_Comm_split(communicators->
work, communicators->file_number, communicators->all_rank, &communicators->
local);
542 MPI_Comm_size(communicators->
local, &communicators->local_size);
543 MPI_Comm_rank(communicators->
local, &communicators->local_rank);
545 communicators->ionode_number = communicators->file_number;
550 if (communicators->work_size != -1) {
553 newtasknr=(communicators->work_rank+read_task_offset)%communicators->work_size;
554 MPI_Comm_split(communicators->
work, 0, newtasknr, &communicators->
workread);
556 MPI_Comm_size(communicators->
workread, &communicators->workread_size);
557 MPI_Comm_rank(communicators->
workread, &communicators->workread_rank);
565 communicators->workread_size = communicators->workread_rank = -1;
566 communicators->local_size = communicators->local_rank = -1;