140 строки
3.8 KiB
C
140 строки
3.8 KiB
C
|
/* -*- C -*-
|
||
|
*
|
||
|
* $HEADER$
|
||
|
*
|
||
|
* The most basic of MPI applications
|
||
|
*/
|
||
|
|
||
|
#include "orte_config.h"
|
||
|
|
||
|
#include <stdio.h>
|
||
|
#include <unistd.h>
|
||
|
|
||
|
|
||
|
|
||
|
#include "opal/util/bit_ops.h"
|
||
|
#include "opal/class/opal_list.h"
|
||
|
#include "opal/class/opal_bitmap.h"
|
||
|
|
||
|
#include "orte/mca/routed/base/base.h"
|
||
|
#include "orte/util/name_fns.h"
|
||
|
#include "orte/runtime/orte_globals.h"
|
||
|
#include "orte/runtime/runtime.h"
|
||
|
|
||
|
static int Radix;
|
||
|
|
||
|
int down_search(int me, int num_procs,
|
||
|
int *num_children, opal_list_t *children, opal_bitmap_t *relatives)
|
||
|
{
|
||
|
int i, peer, Sum, NInLevel, rc;
|
||
|
orte_routed_tree_t *child;
|
||
|
opal_bitmap_t *relations;
|
||
|
|
||
|
/* compute how many procs are at my level */
|
||
|
Sum=1;
|
||
|
NInLevel=1;
|
||
|
|
||
|
while ( Sum < (me+1) ) {
|
||
|
NInLevel *= Radix;
|
||
|
Sum += NInLevel;
|
||
|
}
|
||
|
/* printf("\trank %d inlevel %d\n", me, NInLevel); */
|
||
|
|
||
|
/* our children start at our rank + num_in_level */
|
||
|
peer = me + NInLevel;
|
||
|
for (i = 0; i < Radix; i++) {
|
||
|
if (peer < num_procs) {
|
||
|
child = OBJ_NEW(orte_routed_tree_t);
|
||
|
child->vpid = peer;
|
||
|
if (NULL != children) {
|
||
|
/* printf("\t\tadding child rank %d\n", peer); */
|
||
|
/* this is a direct child - add it to my list */
|
||
|
opal_list_append(children, &child->super);
|
||
|
(*num_children)++;
|
||
|
/* setup the relatives bitmap */
|
||
|
opal_bitmap_init(&child->relatives, num_procs);
|
||
|
/* point to the relatives */
|
||
|
relations = &child->relatives;
|
||
|
} else {
|
||
|
/* printf("\t\tsetting bit for rank %d\n", peer); */
|
||
|
/* we are recording someone's relatives - set the bit */
|
||
|
if (OPAL_SUCCESS != (rc = opal_bitmap_set_bit(relatives, peer))) {
|
||
|
printf("\t\t\tbit not set!\n");
|
||
|
}
|
||
|
/* point to this relations */
|
||
|
relations = relatives;
|
||
|
}
|
||
|
/* printf("\tdownsearching peer %d\n", peer); */
|
||
|
/* search for this child's relatives */
|
||
|
down_search(peer, num_procs, NULL, NULL, relations);
|
||
|
}
|
||
|
peer += NInLevel;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
main(int argc, char **argv)
|
||
|
{
|
||
|
opal_list_t children;
|
||
|
opal_list_item_t *item;
|
||
|
int num_children;
|
||
|
orte_routed_tree_t *child;
|
||
|
int j;
|
||
|
int NProcs;
|
||
|
int Level,Sum,NInLevel,Ii;
|
||
|
int Parent,NInPrevLevel;
|
||
|
|
||
|
|
||
|
if (3 != argc) {
|
||
|
printf("usage: radix r x, where r=radix and x=number of procs\n");
|
||
|
exit(1);
|
||
|
}
|
||
|
|
||
|
orte_init(ORTE_TOOL);
|
||
|
|
||
|
Radix = atoi(argv[1]);
|
||
|
NProcs = atoi(argv[2]);
|
||
|
|
||
|
for(Ii = 0 ; Ii < NProcs ; Ii++) {
|
||
|
OBJ_CONSTRUCT(&children, opal_list_t);
|
||
|
num_children = 0;
|
||
|
Level=0;
|
||
|
Sum=1;
|
||
|
NInLevel=1;
|
||
|
|
||
|
while ( Sum < (Ii+1) ) {
|
||
|
Level++;
|
||
|
NInLevel*=Radix;
|
||
|
Sum+=NInLevel;
|
||
|
}
|
||
|
Sum-=NInLevel;
|
||
|
|
||
|
NInPrevLevel=NInLevel/Radix;
|
||
|
|
||
|
if( 0 == Ii ) {
|
||
|
Parent=-1;
|
||
|
} else {
|
||
|
Parent=(Ii-Sum) % NInPrevLevel;
|
||
|
Parent+=(Sum - NInPrevLevel);
|
||
|
}
|
||
|
|
||
|
fprintf(stderr," I am %d: Parent %d\n",
|
||
|
Ii,Parent);
|
||
|
|
||
|
/* compute children and relatives */
|
||
|
down_search(Ii, NProcs, &num_children, &children, NULL);
|
||
|
while (NULL != (item = opal_list_remove_first(&children))) {
|
||
|
child = (orte_routed_tree_t*)item;
|
||
|
fprintf(stderr, "\tchild %d\n", child->vpid);
|
||
|
for (j=0; j < NProcs; j++) {
|
||
|
if (opal_bitmap_is_set_bit(&child->relatives, j)) {
|
||
|
fprintf(stderr, "\t\trelation %d\n", j);
|
||
|
}
|
||
|
}
|
||
|
OBJ_RELEASE(item);
|
||
|
}
|
||
|
OBJ_DESTRUCT(&children);
|
||
|
}
|
||
|
|
||
|
orte_finalize();
|
||
|
}
|