示例#1
0
文件: entity.c 项目: knz/snet-rts
int SNetThreadingInit(int argc, char **argv)
{
#ifdef USE_CORE_AFFINITY
  int i, num_cores;
#endif
  char fname[32];
  /* initialize the entity counter to 0 */
  entity_count = 0;
  (void) argc; /* NOT USED */
  (void) argv; /* NOT USED */

#ifndef HAVE___THREAD
  pthread_key_create(&thread_self_key, NULL);
#endif

#ifdef USE_CORE_AFFINITY
  for (i=0; i<argc; i++) {
    if(strcmp(argv[i], "-w") == 0 && i + 1 <= argc) {
      /* Number of cores */
      i = i + 1;
      num_cores = atoi(argv[i]);
      SetThreadAffinity( pthread_self(), MAXCORES,  num_cores);
    }
  }
#endif

  snprintf(fname, 31, "mon_n%02u_info.log", SNetDistribGetNodeId());
  SNetThreadingMonitoringInit(fname);

  return 0;
}
示例#2
0
void SNetRouteDynamicEnter(snet_info_t *info, int dynamicIndex, int dynamicLoc,
                           snet_startup_fun_t fun)
{
  snet_dest_t *dest = (snet_dest_t*) SNetInfoGetTag(info, prevDest);
  dest->dynamicIndex = dynamicIndex;

  int *counter = SNetMemAlloc(sizeof(int));
  *counter = 0;
  SNetInfoSetTag(info, infoCounter, (uintptr_t) counter, NULL);

  if (fun != NULL) {
    dest->parent = SNetNetToId(fun);
    dest->parentNode = SNetDistribGetNodeId();
    dest->dynamicLoc = dynamicLoc;
  }

  return;
}
示例#3
0
int SNetThreadingInit(int argc, char **argv)
{
	/* init map from file */
	SNetLocvecMapInit(argc, argv);


#ifdef USE_LOGGING
	char *mon_elts = NULL;
#endif

	lpel_config_t config;
	int i;
	memset(&config, 0, sizeof(lpel_config_t));
	config.type = DECEN_LPEL;

	config.flags = LPEL_FLAG_PINNED; // pinned by default

	/* task migration configure */
	lpel_tm_config_t tm_conf;
	memset(&tm_conf, 0, sizeof(lpel_tm_config_t));
	int tm_mech = 0;
	double tm_threshold = 0.0;

	for (i=0; i<argc; i++) {
		if(strcmp(argv[i], "-m") == 0 && i + 1 <= argc) {
			/* Monitoring level */
			i = i + 1;
#ifdef USE_LOGGING
			mon_elts = argv[i];
#endif
		} else if(strcmp(argv[i], "-excl") == 0 ) {
			/* Assign realtime priority to workers*/
			config.flags |= LPEL_FLAG_EXCLUSIVE;
		} else if(strcmp(argv[i], "-dloc") == 0 ) {
			/* Use distributed s-net location placement */
			dloc_placement = true;
		} else if(strcmp(argv[i], "-co") == 0 && i + 1 <= argc) {
			/* Number of cores for others */
			i = i + 1;
			proc_others = atoi(argv[i]);
		} else if(strcmp(argv[i], "-cw") == 0 && i + 1 <= argc) {
			/* Number of cores for others */
			i = i + 1;
			proc_workers = atoi(argv[i]);
		} else if(strcmp(argv[i], "-w") == 0 && i + 1 <= argc) {
			/* Number of workers */
			i = i + 1;
			num_workers = atoi(argv[i]);
		} else if(strcmp(argv[i], "-sosi") == 0) {
			sosi_placement = true;
		} else if (strcmp(argv[i], "-np") == 0) { // no pinned
			config.flags ^= LPEL_FLAG_PINNED;
		} else if (strcmp(argv[i], "-tm") == 0) {
			i = i + 1;
			tm_mech = atoi(argv[i]);
		} else if (strcmp(argv[i], "-threshold") == 0) {
			i = i +1;
			tm_threshold = atof(argv[i]);
		}
	}

	/* set up task migration configuration */
	switch (tm_mech) {
	case 1:
		tm_conf.mechanism = LPEL_MIG_RAND;
		if (tm_threshold <= 0)
			tm_threshold = 0.5;
		tm_conf.threshold = tm_threshold;
		break;
	case 2:
		tm_conf.mechanism = LPEL_MIG_WAIT_PROP;
		break;
	default:
		tm_conf.mechanism = LPEL_MIG_NONE;
		break;
	}

#ifdef USE_LOGGING
	char fname[20+1];
	if (mon_elts != NULL) {

		if (strchr(mon_elts, MON_ALL_FLAG) != NULL) {
			mon_flags = (1<<7) - 1;
		} else {
			if (strchr(mon_elts, MON_MAP_FLAG) != NULL) mon_flags |= SNET_MON_MAP;
			if (strchr(mon_elts, MON_TIME_FLAG) != NULL) mon_flags |= SNET_MON_TIME;
			if (strchr(mon_elts, MON_WORKER_FLAG) != NULL) mon_flags |= SNET_MON_WORKER;
			if (strchr(mon_elts, MON_TASK_FLAG) != NULL) mon_flags |= SNET_MON_TASK;
			if (strchr(mon_elts, MON_STREAM_FLAG) != NULL) mon_flags |= SNET_MON_STREAM;
			if (strchr(mon_elts, MON_MESSAGE_FLAG) != NULL) mon_flags |= SNET_MON_MESSAGE;
			if (strchr(mon_elts, MON_LOAD_FLAG) != NULL) mon_flags |= SNET_MON_LOAD;
		}

		/* set monitoring framework for task migration */
		if (tm_conf.mechanism == LPEL_MIG_WAIT_PROP)
			mon_flags |= SNET_MON_WAIT_PROP;


		if ( mon_flags & SNET_MON_MAP) {
			snprintf(fname, 20, "n%02d_tasks.map", SNetDistribGetNodeId() );
			/* create a map file */
			mapfile = fopen(fname, "w");
			assert( mapfile != NULL);
			(void) fprintf(mapfile, "%s%c", LOG_FORMAT_VERSION, END_LOG_ENTRY);
		}
	}

#endif

  /* determine number of cpus */
	if ( 0 != LpelGetNumCores( &num_cpus) ) {
		SNetUtilDebugFatal("Could not determine number of cores!\n");
		assert(0);
	}

	if (num_workers == -1)
		config.num_workers = num_cpus;
	else
		config.num_workers = num_workers;

	if (proc_workers == -1)
		config.proc_workers = num_cpus;
	else
		config.proc_workers = proc_workers;

	config.proc_others = proc_others;
#ifdef USE_LOGGING
	/* initialise monitoring module */
	config.mon.num_workers = config.num_workers;
	SNetThreadingMonInit(&config.mon, SNetDistribGetNodeId(), mon_flags);
#endif

	/* assin non-sosi task to non-sosi workers */
	SNetAssignInit(config.num_workers);

	LpelInit(&config);

	/* init task migration */
	tm_conf.num_workers = config.num_workers;
	LpelTaskMigrationInit(&tm_conf);

	/* start Lpel */
	if (LpelStart(&config)) SNetUtilDebugFatal("Could not initialize LPEL!");

	return 0;
}
示例#4
0
int SNetThreadingInit(int argc, char **argv)
{
  lpel_config_t config;
  char fname[20+1];
  int num_others = 0;
  char *mon_elts = NULL;

  LpelInit(&config);

  config.flags = LPEL_FLAG_PINNED;
  config.threshold = 0;

  for (int i = 0; i < argc; i++) {
    if(strcmp(argv[i], "-m") == 0 && i + 1 <= argc) {
      /* Monitoring level */
      i = i + 1;
      mon_elts = argv[i];
    } else if(strcmp(argv[i], "-excl") == 0 ) {
      /* Assign realtime priority to workers*/
      config.flags |= LPEL_FLAG_EXCLUSIVE;
    } else if(strcmp(argv[i], "-dloc") == 0 ) {
      /* Use distributed s-net location placement */
      dloc_placement = true;
    } else if(strcmp(argv[i], "-wo") == 0 && i + 1 <= argc) {
      /* Number of cores for others */
      i = i + 1;
      num_others = atoi(argv[i]);
    } else if(strcmp(argv[i], "-w") == 0 && i + 1 <= argc) {
      /* Number of workers */
      i = i + 1;
      num_workers = atoi(argv[i]);
    } else if(strcmp(argv[i], "-threshold") == 0 && i + 1 <= argc) {
      /* Threshold for placement scheduler */
      i = i + 1;
      config.threshold = atof(argv[i]);
    } else if(strcmp(argv[i], "-sockets") == 0 && i + 1 <= argc) {
      i = i + 1;
      config.sockets = atoi(argv[i]);
    } else if(strcmp(argv[i], "-cores") == 0 && i + 1 <= argc) {
      i = i + 1;
      config.cores = atoi(argv[i]);
    } else if(strcmp(argv[i], "-threads") == 0 && i + 1 <= argc) {
      i = i + 1;
      config.threads = atoi(argv[i]);
    } else if(strcmp(argv[i], "-gather") == 0) {
      config.gather = 1;
    }
  }


#ifdef USE_LOGGING
  if (mon_elts != NULL) {
    if (strchr(mon_elts, MON_ALL_FLAG) != NULL) {
      mon_flags = (1<<7) - 1;
    } else {
      if (strchr(mon_elts, MON_MAP_FLAG) != NULL) mon_flags |= SNET_MON_MAP;
      if (strchr(mon_elts, MON_TIME_FLAG) != NULL) mon_flags |= SNET_MON_TIME;
      if (strchr(mon_elts, MON_WORKER_FLAG) != NULL) mon_flags |= SNET_MON_WORKER;
      if (strchr(mon_elts, MON_TASK_FLAG) != NULL) mon_flags |= SNET_MON_TASK;
      if (strchr(mon_elts, MON_STREAM_FLAG) != NULL) mon_flags |= SNET_MON_STREAM;
      if (strchr(mon_elts, MON_MESSAGE_FLAG) != NULL) mon_flags |= SNET_MON_MESSAGE;
      if (strchr(mon_elts, MON_LOAD_FLAG) != NULL) mon_flags |= SNET_MON_LOAD;
    }



    if ( mon_flags & SNET_MON_MAP) {
      snprintf(fname, 20, "n%02d_tasks.map", SNetDistribGetNodeId() );
      /* create a map file */
      mapfile = fopen(fname, "w");
      assert( mapfile != NULL);
      (void) fprintf(mapfile, "%s%c", LOG_FORMAT_VERSION, END_LOG_ENTRY);
    }
  }
#endif

  config.proc_others = num_others;
  if (num_workers) {
    config.proc_workers = num_workers;
    config.num_workers = config.proc_others + config.proc_workers;
  } else {
    config.proc_workers = config.num_workers - config.proc_others;
    num_workers = config.proc_workers;
  }

#ifdef USE_LOGGING
  /* initialise monitoring module */
  SNetThreadingMonInit(&config.mon, SNetDistribGetNodeId(), mon_flags);
#endif

  SNetAssignInit(config.num_workers);

  if (LpelStart(&config)) SNetUtilDebugFatal("Could not initialize LPEL!");

  return 0;
}
示例#5
0
/* DripBack process a record. */
void SNetNodeDripBack(snet_stream_desc_t *desc, snet_record_t *rec)
{
  landing_t             *land = desc->landing;
  dripback_arg_t        *darg = LAND_NODE_SPEC(land, dripback);

  trace(__func__);

  if (land->type == LAND_dripback1) {
    landing_dripback1_t *db1 = LAND_SPEC(land, dripback1);
    landing_dripback2_t *db2 = LAND_SPEC(db1->dripback2, dripback2);
    SNetFifoPut(db1->recfifo, rec);
    if (FAA(&db2->queued, 1) == 0) {
      if (db1->controldesc == NULL) {
        SNetPushLanding(desc, db1->dripback2);
        db1->controldesc = SNetStreamOpen(darg->selfref, desc);
      }
      rec = SNetRecCreate(REC_wakeup);
      SNetWrite(&db1->controldesc, rec, true);
    }
  }
  else if (land->type == LAND_dripback2) {
    landing_dripback2_t *db2 = LAND_SPEC(land, dripback2);
    bool via_access = (DESC_STREAM(desc) == darg->selfref);

    assert(via_access || DESC_STREAM(desc) == darg->dripback);

    while (rec) {
      switch (REC_DESCR( rec)) {
        case REC_data:
          /* Test if record should go to the instance. */
          if (SNetFeedbackMatch( rec, darg->back_patterns, darg->guards)) {
            if (via_access) {
              /* Because record came from outside add a detref counter. */
              assert(db2->detfifo.head->next == NULL);
              SNetRecDetrefAdd(rec, ++(db2->entered), land, &db2->detfifo);
            } else {
              /* Record came from the instance. */
              assert(DATA_REC(rec, detref));
            }
            if (db2->instdesc == NULL) {
              /* Instance should come back to this landing. */
              if (SNetTopLanding(desc) != land) {
                SNetPushLanding(desc, land);
              }
              db2->instdesc = SNetStreamOpen(darg->instance, desc);
              if (SNetTopLanding(desc) == land) {
                SNetPopLanding(desc);
                SNetLandingDone(land);
              }
            }
            SNetWrite(&db2->instdesc, rec, false);
          } else {
            if (!via_access) {
              /* Record leaves the dripback loop. */
              assert(DATA_REC(rec, detref));
              SNetFeedbackLeave(rec, land, &db2->detfifo);
            }
            if (db2->outdesc == NULL) {
              db2->outdesc = SNetStreamOpen(darg->output, desc);
            }
            SNetWrite(&db2->outdesc, rec, false);
          }
          break;

        case REC_wakeup:
          assert(via_access);
          SNetRecDestroy(rec);
          break;

        case REC_terminate:
          assert(via_access);
          assert(db2->terminate == DripBackInitial);
          db2->terminate = DripBackDraining;
          SNetRecDestroy(rec);
          break;

        case REC_detref:
          if (DETREF_REC( rec, leave) == land &&
              DETREF_REC( rec, location) == SNetDistribGetNodeId())
          {
            assert(!via_access);
            SNetDetLeaveCheckDetref(rec, &db2->detfifo);
            if (DETREF_REC( rec, detref) == SNetFifoPeekFirst(&db2->detfifo)) {
              DripBackCheckBusy(db2);
            }
            SNetRecDestroy(rec);
          } else {
            assert(via_access);
            if (db2->outdesc == NULL) {
              db2->outdesc = SNetStreamOpen(darg->output, desc);
            }
            SNetWrite(&db2->outdesc, rec, false);
          }
          break;

        case REC_sync:
          SNetRecDestroy(rec);
          break;

        default:
          SNetRecUnknownEnt(__func__, rec, darg->entity);
      }
      rec = NULL;
      if (db2->state == DripBackBusy) {
        if (DripBackCheckBusy(db2) == false) {
          assert(db2->queued > 0);
          if (SAF(&db2->queued, 1) == 0) {
            db2->state = DripBackIdle;
          } else {
            rec = SNetFifoGet(&db2->recfifo);
            assert(rec);
            via_access = true;
          }
        }
      } else {
        assert(db2->state == DripBackIdle);
        assert(SNetFifoPeekFirst(&db2->detfifo) == NULL);
        if (db2->queued > 0) {
          rec = SNetFifoGet(&db2->recfifo);
          assert(rec);
          via_access = true;
          db2->state = DripBackBusy;
        }
      }
    }
    if (db2->terminate == DripBackDraining) {
      if (db2->state == DripBackIdle) {
        assert(db2->queued == 0 && DripBackCheckBusy(db2) == false);
        db2->terminate = DripBackTerminated;
      }
    }
    if (db2->terminate == DripBackTerminated) {
      if (db2->instdesc) {
        snet_stream_desc_t *desc = db2->instdesc;
        db2->instdesc = NULL;
        SNetDescDone(desc);
        SNetLandingDone(land);
      }
    }
  }
  else {
    assert(0);
  }
}
示例#6
0
/*****************************************************************************
 * Helper functions
 ****************************************************************************/
static void GenerateRecId(snet_record_id_t *rid)
{
  assert( SNET_REC_SUBID_NUM == 2 );
  rid->subid[0] = SNetAtomicCntFetchAndInc(&recid_sequencer);
  rid->subid[1] = SNetDistribGetNodeId();
}
示例#7
0
void startMonMPI() {
  int node = SNetDistribGetNodeId();
  char fn[1000];
  sprintf(fn, "n%02d_comm.log", node);
  mon_mpi = fopen(fn, "w");
}