18 #include "partest_split_comm.h" 19 #include "partest_util.h" 22 #include <firmware/include/personality.h> 23 #include <spi/include/kernel/process.h> 24 #include <spi/include/kernel/location.h> 26 #include <hwi/include/bqc/A2_inlines.h> 28 #include <hwi/include/common/uci.h> 33 #include <common/bgp_personality.h> 34 #include <common/bgp_personality_inlines.h> 56 int split_communicator(
_test_communicators * communicators,
int bluegene,
int bluegene_np,
int bluegene_sort,
int numfiles,
int read_task_offset,
int verbose)
60 communicators->work_size = communicators->work_rank = -2;
61 communicators->local_size = communicators->local_rank = -2;
67 _BGP_Personality_t personality;
68 MPI_Comm commSame, commDiff, commTemp;
69 int sizeSame, sizeDiff;
70 int rankSame, rankDiff;
72 unsigned procid, x, y, z, t;
73 char cbuffer[MAXCHARLEN];
76 Kernel_GetPersonality(&personality,
sizeof(personality));
77 BGP_Personality_getLocationString(&personality, location);
78 procid = Kernel_PhysicalProcessorID();
79 MPIX_rank2torus(communicators->all_rank, &x, &y, &z, &t);
82 MPIX_Pset_diff_comm_create(&commDiff);
83 MPI_Comm_size(commDiff, &sizeDiff);
84 MPI_Comm_rank(commDiff, &rankDiff);
85 communicators->ionode_number = rankDiff;
88 MPIX_Pset_same_comm_create(&commSame);
89 MPI_Comm_size(commSame, &sizeSame);
90 MPI_Comm_rank(commSame, &rankSame);
93 if (bluegene_np == 0) {
94 bluegene_np = sizeSame;
98 MPI_Comm_split(communicators->
all, (rankSame < bluegene_np), communicators->all_rank, &communicators->
work);
99 MPI_Comm_size(communicators->
work, &communicators->work_size);
100 MPI_Comm_rank(communicators->
work, &communicators->work_rank);
101 if (rankSame >= bluegene_np) {
103 communicators->work_size = communicators->work_rank = -1;
104 communicators->local_size = communicators->local_rank = -1;
110 communicators->
local = communicators->
work;
112 else if(numfiles<0) {
115 MPI_Comm_split(commSame, (rankSame < bluegene_np), communicators->all_rank, &communicators->
local);
119 communicators->
local=commDiff;
122 MPI_Comm_size(communicators->
local, &communicators->local_size);
123 MPI_Comm_rank(communicators->
local, &communicators->local_rank);
128 if(numfiles==-1) communicators->file_number = rankDiff;
129 else communicators->file_number = rankSame;
132 communicators->file_number = -1;
136 sprintf(cbuffer,
"");
137 if (rankSame < bluegene_np) {
139 sprintf(cbuffer,
"BGP[%05d] diff_comm: %4d of %4d same_comm: %5d of %5d file_comm: %5d of %5d %s phys_xyzt(%d,%d,%d,%d)\n",
140 communicators->all_rank, rankDiff + 1, sizeDiff, rankSame + 1, sizeSame, communicators->local_rank + 1, communicators->local_size,
141 location, x, y, z, t);
144 collective_print_gather(cbuffer, communicators->
work);
151 Personality_t personality;
152 MPI_Comm commSame, commDiff, commTemp;
154 int sizeSame, sizeDiff;
155 int rankSame, rankDiff;
157 int factor, bridgeid,core, hwthread,procid;
158 int dist_to_bridge, isonbridge;
159 char cbuffer[MAXCHARLEN];
161 BG_UniversalComponentIdentifier uci;
162 unsigned int row, col, mp, nb, cc;
164 int key, color, baseid;
166 if(communicators->all_rank==0) {
167 starttime=MPI_Wtime();
168 printf(
"partest_split_comm[%d]: starting at Wt=%10.3fs\n",communicators->all_rank,starttime);
172 Kernel_GetPersonality(&personality,
sizeof(Personality_t));
174 uci = personality.Kernel_Config.UCI;
175 bg_decodeComputeCardOnNodeBoardUCI(uci, &row, &col, &mp, &nb, &cc);
177 procid = Kernel_ProcessorID();
178 core = Kernel_ProcessorCoreID();
179 hwthread = Kernel_ProcessorThreadID();
181 sprintf(location,
"R%x%x-M%d-N%02x-J%02x <%d,%d,%d,%d,%d> p%02dc%02dt%1d", row, col, mp, nb, cc,
182 personality.Network_Config.Acoord, personality.Network_Config.Bcoord,
183 personality.Network_Config.Ccoord, personality.Network_Config.Dcoord,
184 personality.Network_Config.Ecoord,
185 procid,core,hwthread);
188 ( personality.Network_Config.Acoord==personality.Network_Config.cnBridge_A ) &&
189 ( personality.Network_Config.Bcoord==personality.Network_Config.cnBridge_B ) &&
190 ( personality.Network_Config.Ccoord==personality.Network_Config.cnBridge_C ) &&
191 ( personality.Network_Config.Dcoord==personality.Network_Config.cnBridge_D ) &&
192 ( personality.Network_Config.Ecoord==personality.Network_Config.cnBridge_E )
200 dist_to_bridge=MPIX_IO_distance();
204 bridgeid = personality.Network_Config.cnBridge_E;
205 factor *= personality.Network_Config.Enodes;
206 bridgeid += personality.Network_Config.cnBridge_D*factor;
207 factor *= personality.Network_Config.Dnodes;
208 bridgeid += personality.Network_Config.cnBridge_C*factor;
209 factor *= personality.Network_Config.Cnodes;
210 bridgeid += personality.Network_Config.cnBridge_B*factor;
211 factor *= personality.Network_Config.Bnodes;
212 bridgeid += personality.Network_Config.cnBridge_A*factor;
218 if(bluegene_sort==0) {
219 key = MPIX_IO_distance();
221 key = communicators->all_rank;
224 MPI_Comm_split(communicators->
all, bridgeid, key, &commSame);
225 MPI_Comm_size(commSame, &sizeSame);
226 MPI_Comm_rank(commSame, &rankSame);
230 MPI_Comm_split(communicators->
all, rankSame, bridgeid, &commDiff);
231 MPI_Comm_size(commDiff, &sizeDiff);
232 MPI_Comm_rank(commDiff, &rankDiff);
234 communicators->ionode_number = rankDiff;
237 MPI_Comm commSameIOB, commDiffIOB;
238 int sizeSameIOB, sizeDiffIOB;
239 int rankSameIOB, rankDiffIOB;
243 key = communicators->all_rank;
244 MPI_Comm_split(communicators->
all, bridgeid, key, &commSameIOB);
245 MPI_Comm_size(commSameIOB, &sizeSameIOB);
246 MPI_Comm_rank(commSameIOB, &rankSameIOB);
248 if(communicators->all_rank==0) {
249 printf(
"partest_split_comm[%d]: after split commSameIOB deltaWt=%10.3fs\n",communicators->all_rank,MPI_Wtime()-starttime);
254 ionid=MPIX_IO_node_id();
256 MPI_Bcast(&ionid, 1, MPI_INT, 0, commSameIOB);
258 if(communicators->all_rank==0) {
259 printf(
"partest_split_comm[%d]: after get ionid deltaWt=%10.3fs\n",communicators->all_rank,MPI_Wtime()-starttime);
263 if(bluegene_sort==0) {
264 key = MPIX_IO_distance();
266 key = communicators->all_rank;
269 rc=MPI_Comm_split(communicators->
all,color,key,&commSame);
270 MPI_Comm_size(commSame, &sizeSame);
271 MPI_Comm_rank(commSame, &rankSame);
274 if(communicators->all_rank==0) {
275 printf(
"partest_split_comm[%d]: after split commSame deltaWt=%10.3fs\n",communicators->all_rank,MPI_Wtime()-starttime);
279 if(rankSame==0) baserank=communicators->all_rank;
280 MPI_Bcast(&baserank, 1, MPI_INT, 0, commSame);
282 if(communicators->all_rank==0) {
283 printf(
"partest_split_comm[%d]: after bcast baserank deltaWt=%10.3fs\n",communicators->all_rank,MPI_Wtime()-starttime);
289 MPI_Comm_split(communicators->
all,color,key,&commDiff);
290 MPI_Comm_size(commDiff, &sizeDiff);
291 MPI_Comm_rank(commDiff, &rankDiff);
293 if(communicators->all_rank==0) {
294 printf(
"partest_split_comm[%d]: after split commDiff deltaWt=%10.3fs\n",communicators->all_rank,MPI_Wtime()-starttime);
303 if (bluegene_np == 0) {
304 bluegene_np = sizeSame;
309 MPI_Comm_split(communicators->
all, (rankSame < bluegene_np), communicators->all_rank, &communicators->
work);
310 MPI_Comm_size(communicators->
work, &communicators->work_size);
311 MPI_Comm_rank(communicators->
work, &communicators->work_rank);
312 if (rankSame >= bluegene_np) {
314 communicators->work_size = communicators->work_rank = -1;
315 communicators->local_size = communicators->local_rank = -1;
317 if(communicators->all_rank==0) {
318 printf(
"partest_split_comm[%d]: after split work deltaWt=%10.3fs\n",communicators->all_rank,MPI_Wtime()-starttime);
324 communicators->
local = communicators->
work;
326 else if(numfiles<0) {
330 MPI_Comm_split(commSame, (rankSame < bluegene_np), rankSame, &communicators->
local);
333 color=(rankSame < bluegene_np)?baseid:MPI_UNDEFINED;
334 MPI_Comm_split(communicators->
all, color, rankSame, &communicators->
local);
336 if (rankSame < bluegene_np) {
337 MPI_Comm_size(communicators->
local, &communicators->local_size);
338 MPI_Comm_rank(communicators->
local, &communicators->local_rank);
341 if(communicators->all_rank==0) {
342 printf(
"partest_split_comm[%d]: after split local deltaWt=%10.3fs\n",communicators->all_rank,MPI_Wtime()-starttime);
348 communicators->
local=commDiff;
349 MPI_Comm_size(communicators->
local, &communicators->local_size);
350 MPI_Comm_rank(communicators->
local, &communicators->local_rank);
357 if(numfiles==-1) communicators->file_number = rankDiff;
358 else communicators->file_number = rankSame;
361 communicators->file_number = -1;
364 if(communicators->all_rank==0) {
365 printf(
"partest_split_comm[%d]: before print verbose deltaWt=%10.3fs\n",communicators->all_rank,MPI_Wtime()-starttime);
369 sprintf(cbuffer,
"");
370 if (rankSame < bluegene_np) {
371 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",
372 communicators->all_rank, rankDiff + 1, sizeDiff, rankSame + 1, sizeSame, communicators->local_rank + 1,
373 communicators->local_size, location,isonbridge,dist_to_bridge);
375 collective_print_gather(cbuffer, communicators->
work);
377 if(communicators->all_rank==0) {
378 printf(
"partest_split_comm[%d]: after print verbose/end deltaWt=%10.3fs\n",communicators->all_rank,MPI_Wtime()-starttime);
386 _BGP_Personality_t personality;
387 MPI_Comm commSame, commDiff, commTemp;
388 int sizeSame, sizeDiff;
389 int rankSame, rankDiff;
390 char location[BGLPERSONALITY_MAX_LOCATION];
391 unsigned procid, x, y, z, t;
392 BGLPersonality personality;
393 char cbuffer[MAXCHARLEN];
396 rts_get_personality(&personality,
sizeof(personality));
397 BGLPersonality_getLocationString(&personality, location);
398 x = BGLPersonality_xCoord(&personality),
399 y = BGLPersonality_yCoord(&personality), z = BGLPersonality_zCoord(&personality), t = rts_get_processor_id()
402 PMI_Pset_diff_comm_create(&commDiff);
403 MPI_Comm_size(commDiff, &sizeDiff);
404 MPI_Comm_rank(commDiff, &rankDiff);
405 *ionode_number = rankDiff;
408 PMI_Pset_same_comm_create(&commSame);
409 MPI_Comm_size(commSame, &sizeSame);
410 MPI_Comm_rank(commSame, &rankSame);
413 if (bluegene_np == 0) {
414 bluegene_np = sizeSame;
418 MPI_Comm_split(communicators->
all, (rankSame < bluegene_np), communicators->all_rank, &communicators->
work);
419 MPI_Comm_size(communicators->
work, &communicators->work_size);
420 MPI_Comm_rank(communicators->
work, &communicators->work_rank);
425 communicators->
local = communicators->
work;
429 MPI_Comm_split(commSame, (rankSame < bluegene_np), communicators->all_rank, &communicators->
local);
431 MPI_Comm_size(communicators->
local, &communicators->local_size);
432 MPI_Comm_rank(communicators->
local, &communicators->local_rank);
437 communicators->file_number = rankDiff;
440 communicators->file_number = -1;
444 sprintf(cbuffer,
"");
445 if (rankSame < bluegene_np) {
447 sprintf(cbuffer,
"BGL[%05d] diff_comm: %4d of %4d same_comm: %5d of %5d file_comm: %5d of %5d %s phys_xyzt(%d,%d,%d,%d)\n",
448 communicators->all_rank, rankDiff + 1, sizeDiff, rankSame + 1, sizeSame,
449 communicators->local_rank + 1, communicators->local_size, location, x, y, z, t);
452 collective_print_gather(cbuffer, communicators->
work);
464 gethostname(location, 256);
465 char cbuffer[MAXCHARLEN];
466 sprintf(cbuffer,
"DARWIN[%03d] diff_comm: %4d of %4d same_comm: %4d of %4d file_comm: %4d of %4d %s\n",
467 communicators->all_rank, communicators->all_rank, communicators->all_size,
468 communicators->work_rank, communicators->work_size, communicators->local_rank, communicators->local_size, location);
469 collective_print_gather(cbuffer, communicators->
all);
474 #if defined( _SION_LINUX) && (!defined(_SION_FX)) 477 gethostname(location, 256);
478 char cbuffer[MAXCHARLEN];
479 sprintf(cbuffer,
"LINUX[%03d] diff_comm: %4d of %4d same_comm: %4d of %4d file_comm: %4d of %4d %s\n",
480 communicators->all_rank, communicators->all_rank, communicators->all_size,
481 communicators->work_rank, communicators->work_size, communicators->local_rank, communicators->local_size, location);
482 collective_print_gather(cbuffer, communicators->
all);
490 gethostname(location, 256);
491 int sizeSame = 0, sizeDiff = 0;
492 int rankSame, rankDiff;
493 char cbuffer[MAXCHARLEN];
494 sprintf(cbuffer,
"AIX[%03d] diff_comm: %4d of %4d same_comm: %4d of %4d file_comm: %4d of %4d %s\n",
495 communicators->all_rank, communicators->all_rank, communicators->all_size,
496 communicators->work_rank, communicators->work_size, communicators->local_rank, communicators->local_size, location);
497 collective_print_gather(cbuffer, communicators->
all);
504 int rank, x, y, z, a, b, c, rc;
506 char cbuffer[MAXCHARLEN];
508 MPI_Comm commSame, commDiff;
509 int sizeSame, sizeDiff;
510 int rankSame, rankDiff;
512 gethostname(location, 256);
513 MPI_Comm_rank(MPI_COMM_WORLD, &rank);
514 rc=FJMPI_Topology_sys_rank2xyzabc(rank, &x, &y, &z, &a, &b, &c);
516 ionodeid=x * 65536 + y;
521 MPI_Comm_split(communicators->
all, ionodeid, communicators->all_rank, &commSame);
522 MPI_Comm_size(commSame, &sizeSame);
523 MPI_Comm_rank(commSame, &rankSame);
526 MPI_Comm_split(communicators->
all, rankSame, ionodeid, &commDiff);
527 MPI_Comm_size(commDiff, &sizeDiff);
528 MPI_Comm_rank(commDiff, &rankDiff);
530 communicators->ionode_number = rankDiff;
533 bluegene_np = sizeSame;
537 MPI_Comm_split(communicators->
all, (rankSame < bluegene_np), communicators->all_rank, &communicators->
work);
538 MPI_Comm_size(communicators->
work, &communicators->work_size);
539 MPI_Comm_rank(communicators->
work, &communicators->work_rank);
540 if (rankSame >= bluegene_np) {
542 communicators->work_size = communicators->work_rank = -1;
543 communicators->local_size = communicators->local_rank = -1;
549 communicators->
local = communicators->
work;
551 else if(numfiles<0) {
554 MPI_Comm_split(commSame, (rankSame < bluegene_np), communicators->all_rank, &communicators->
local);
558 communicators->
local=commDiff;
561 MPI_Comm_size(communicators->
local, &communicators->local_size);
562 MPI_Comm_rank(communicators->
local, &communicators->local_rank);
567 if(numfiles==-1) communicators->file_number = rankDiff;
568 else communicators->file_number = rankSame;
571 communicators->file_number = -1;
575 sprintf(cbuffer,
"");
576 if (rankSame < bluegene_np) {
577 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",
579 communicators->all_rank, rankDiff, sizeDiff, rankSame, sizeSame,
580 communicators->local_rank, communicators->local_size,
581 x,y,z,a,b,c, location, ionodeid, communicators->ionode_number, rc, numfiles);
583 collective_print_gather(cbuffer, communicators->
all);
592 gethostname(location, 256);
593 int sizeSame = 0, sizeDiff = 0;
594 int rankSame, rankDiff;
595 char cbuffer[MAXCHARLEN];
597 rca_mesh_coord_t xyz;
599 rc=PMI_Get_nid(communicators->all_rank,&nid);
601 rca_get_meshcoord(nid, &xyz);
603 sprintf(cbuffer,
"XT[%03d] diff_comm: %4d of %4d same_comm: %4d of %4d file_comm: %4d of %4d %s nid=%d phys_xyz(%d,%d,%d)\n",
604 communicators->all_rank, communicators->all_rank, communicators->all_size,
605 communicators->work_rank, communicators->work_size, communicators->local_rank, communicators->local_size, location,
606 nid, xyz.mesh_x,xyz.mesh_y,xyz.mesh_z);
607 collective_print_gather(cbuffer, communicators->
all);
613 if (communicators->work_size == -2) {
615 communicators->
work = communicators->
all;
616 MPI_Comm_size(communicators->
work, &communicators->work_size);
617 MPI_Comm_rank(communicators->
work, &communicators->work_rank);
620 if (communicators->local_size == -2) {
622 communicators->
local = communicators->
work;
626 numfiles = communicators->work_size / 2;
630 proc_per_file = communicators->work_size / numfiles;
633 if (communicators->work_rank >= (numfiles * proc_per_file)) {
634 communicators->file_number = numfiles - 1;
637 communicators->file_number = communicators->work_rank / proc_per_file;
640 MPI_Comm_split(communicators->
work, communicators->file_number, communicators->all_rank, &communicators->
local);
642 MPI_Comm_size(communicators->
local, &communicators->local_size);
643 MPI_Comm_rank(communicators->
local, &communicators->local_rank);
645 communicators->ionode_number = communicators->file_number;
650 if (communicators->work_size != -1) {
653 newtasknr=(communicators->work_rank+read_task_offset)%communicators->work_size;
654 MPI_Comm_split(communicators->
work, 0, newtasknr, &communicators->
workread);
656 MPI_Comm_size(communicators->
workread, &communicators->workread_size);
657 MPI_Comm_rank(communicators->
workread, &communicators->workread_rank);
665 communicators->workread_size = communicators->workread_rank = -1;
666 communicators->local_size = communicators->local_rank = -1;