コード例 #1
0
ファイル: stream.c プロジェクト: stefankok/snet-rts
snet_stream_t *SNetStreamCreate(int capacity)
{
  snet_stream_t *s = SNetMemAlloc(sizeof(snet_stream_t));
  pthread_mutex_init(&s->lock, NULL);
  pthread_cond_init(&s->notempty, NULL);
  pthread_cond_init(&s->notfull, NULL);


  s->size = (capacity > 0) ? capacity : SNET_STREAM_DEFAULT_CAPACITY;
  s->head = 0;
  s->tail = 0;
  s->count = 0;
  s->buffer = SNetMemAlloc( s->size*sizeof(void*) );

  s->producer = NULL;
  s->consumer = NULL;
  s->is_poll = 0;

  memset( s->buffer, 0, s->size*sizeof(void*) );

  s->source = NULL;

  s->callback_read.func = NULL;
  s->callback_read.arg = NULL;
  return s;
}
コード例 #2
0
ファイル: collector.c プロジェクト: foliern/snet-rts
/**
 * Collector creation function
 * @pre num >= 1
 */
snet_stream_t *CollectorCreateStatic( int num, snet_stream_t **instreams, int location, snet_info_t *info)
{
  snet_stream_t *outstream;
  coll_arg_t *carg;
  int i;

  assert(num >= 1);
  /* create outstream */
  outstream =  SNetStreamCreate(0);

  /* create collector handle */
  carg = (coll_arg_t *) SNetMemAlloc( sizeof( coll_arg_t));
  carg->output = outstream;
  carg->is_static = true;
  CARG_ST(carg, num) = num;
  /* copy instreams */
  CARG_ST(carg, inputs) = SNetMemAlloc(num * sizeof(snet_stream_t *));
  for(i=0; i<num; i++) {
    CARG_ST(carg, inputs[i]) = instreams[i];
  }

  /* spawn collector task */
  SNetThreadingSpawn(
      SNetEntityCreate( ENTITY_collect, location, SNetLocvecGet(info),
        "<collect>", CollectorTask, (void*)carg)
      );
  return outstream;
}
コード例 #3
0
void SNetDistribInit(int argc, char **argv, snet_info_t *info)
{
  int *counter = SNetMemAlloc(sizeof(int));
  snet_dest_t *dest = SNetMemAlloc(sizeof(snet_dest_t));;

  *counter = 0;

  dest->node = 0;
  dest->dest = *counter;
  dest->parent = 0;
  dest->parentNode = 0;
  dest->dynamicIndex = 0;
  dest->dynamicLoc = 0;

  prevDest = SNetInfoCreateTag();
  SNetInfoSetTag(info, prevDest, (uintptr_t) dest,
                 (void* (*)(void*)) &SNetDestCopy);

  infoCounter = SNetInfoCreateTag();
  SNetInfoSetTag(info, infoCounter, (uintptr_t) counter, NULL);

  SNetDistribImplementationInit(argc, argv, info);

  SNetReferenceInit();
  SNetOutputManagerInit();
  SNetInputManagerInit();
}
コード例 #4
0
ファイル: distribution.c プロジェクト: riccardomc/snet-rts
void  SNetDistribZMQUnpack(zframe_t **srcframe, void *dst, size_t count)
{
  if (*srcframe != NULL) {
    size_t dst_size = count;
    size_t srcframe_size = zframe_size(*srcframe);
    byte *srcframe_data = zframe_data(*srcframe);

    if(dst_size > srcframe_size) {
      dst = NULL;
    } else {
      memcpy(dst, srcframe_data, dst_size);
      if ((srcframe_size - dst_size) != 0) {
        byte *newdst = SNetMemAlloc(srcframe_size - dst_size);
        memcpy(newdst, srcframe_data + count, srcframe_size - dst_size);
        zframe_reset(*srcframe, newdst, srcframe_size - dst_size);
        SNetMemFree(newdst);
      } else {
        zframe_destroy(srcframe);
        *srcframe = NULL;
      }
    }

  } else {
    dst = NULL;
  }
}
コード例 #5
0
ファイル: deblockboxes.c プロジェクト: zayac/cholesky
/* Convert an array of chars to a nul-terminated string. */
static char* chars_to_string(c4snet_data_t *c4data)
{
  size_t size = C4SNetArraySize(c4data);
  char* str = SNetMemAlloc(size + 1);

  memcpy(str, C4SNetGetData(c4data), size);
  str[size] = '\0';
  return str;
}
コード例 #6
0
ファイル: deblockboxes.c プロジェクト: zayac/cholesky
void * decompose (void *hnd, c4snet_data_t *InFile, c4snet_data_t *OutFile,
    int a_size, int bs)
{
    int p, i, j;
    double *array;
    tile *atiles, *ltiles;
    char *infile;

    if (bs <= 0) {
        fprintf (stderr, "A block size must be greater than 0\n");
        exit (1);
    }
    if (a_size <= 0) {
        fprintf (stderr, "The dimension of matrix must be greater than 0\n");
        exit (1);
    }
    if (a_size % bs) {
        fprintf(stderr, 
            "matrix size %d is not a multiple of the block size %d\n",
            a_size, bs);
        exit(1);
    }

    p = a_size / bs;

    /* Get the input filename as a string. */
    infile = chars_to_string(InFile);
    outfile = chars_to_string(OutFile);
    C4SNetFree(InFile);
    C4SNetFree(OutFile);

    array = SNetMemAlloc(a_size * a_size * sizeof(double));
    read_matrix(a_size, array, infile);
    free(infile);

    if (clock_gettime(CLOCK_REALTIME, &begin)) {
        pexit("clock_gettime");
    }

    atiles = (tile *) malloc (sizeof (tile) * p * p);
    ltiles = (tile *) malloc (sizeof (tile) * p * p);
    memset (atiles, 0, sizeof (tile) * p * p);
    memset (ltiles, 0, sizeof (tile) * p * p);
    for (i = 0; i < p; i++)
        for (j = 0; j <= i; j++) {
            atiles[j * p + i] = (double *) malloc (sizeof (double) * bs * bs);
            ltiles[j * p + i] = (double *) malloc (sizeof (double) * bs * bs);
            int ai, aj, ti, tj;
            for (ai = i * bs, ti = 0; ti < bs; ai++, ti++)
                for (aj = j * bs, tj = 0; tj < bs; aj++, tj++)
                    atiles[j * p + i][tj * bs + ti] = array[aj * a_size + ai];
        }
    C4SNetOut (hnd, 1, C4SNetCreate (CTYPE_char, sizeof (void *), &atiles),
               C4SNetCreate (CTYPE_char, sizeof (void *), &ltiles), bs, p, 0);
    free(array);
    return hnd;
}
コード例 #7
0
ファイル: list-template.c プロジェクト: riccardomc/snet-rts
snet_list_t *LIST_FUNCTION(LIST_NAME, Copy)(snet_list_t *list)
{
  snet_list_t *result = SNetMemAlloc(sizeof(snet_list_t));

  result->size = list->used;
  result->used = list->used;
  result->start = 0;

  result->values = SNetMemAlloc(list->used * sizeof(LIST_VAL));

  int startToArrayEnd = list->size - list->start;
  memcpy(result->values, list->values + list->start,
         startToArrayEnd * sizeof(LIST_VAL));
  memcpy(result->values + startToArrayEnd, list->values,
         (list->size - startToArrayEnd) * sizeof(LIST_VAL));

  return result;
}
コード例 #8
0
ファイル: list-template.c プロジェクト: riccardomc/snet-rts
snet_list_t *LIST_FUNCTION(LIST_NAME, Create)(int size, ...)
{
  int i;
  va_list args;
  snet_list_t *result = SNetMemAlloc(sizeof(snet_list_t));

  result->size = size;
  result->used = size;
  result->start = 0;
  result->values = SNetMemAlloc(size * sizeof(LIST_VAL));

  va_start(args, size);
  for (i = 0; i < size; i++) {
    result->values[i] = va_arg(args, LIST_VAL);
  }
  va_end(args);

  return result;
}
コード例 #9
0
ファイル: wrappers.c プロジェクト: gijsbers/snet-rts
static usrdata_t *CheckCreateUsrdata(lpel_stream_t * ls)
{
  usrdata_t *dat = LpelStreamGetUsrData(ls);
  if (dat == NULL) {
    dat = SNetMemAlloc(sizeof(usrdata_t));
    dat->source = NULL;
    dat->callback_read.func = NULL;
    dat->callback_read.arg = NULL;
    LpelStreamSetUsrData(ls, dat);
  }
  return dat;
}
コード例 #10
0
ファイル: C4SNet.c プロジェクト: sri-prasanna/snet-rts
static void *SCCUnpackFun(void *buf)
{
  c4snet_data_t *result = SNetMemAlloc(sizeof(c4snet_data_t));
  SNetDistribUnpack(result, buf, false, sizeof(c4snet_data_t));

  result->ref_count = 1;
  if (result->vtype == VTYPE_array) {
    SNetDistribUnpack(&result->data.ptr, buf, true);
  }

  return result;
}
コード例 #11
0
ファイル: C4SNet.c プロジェクト: sri-prasanna/snet-rts
/* Get a copy of an unterminated char array as a proper C string. */
char* C4SNetGetString(c4snet_data_t *data)
{
  if (data->type != CTYPE_char && data->type != CTYPE_uchar) {
    SNetUtilDebugFatal("[%s]: Not a char array type %d.", __func__, data->type);
    return NULL; /* NOT REACHED */
  } else {
    size_t size = C4SNetArraySize(data);
    char* str = SNetMemAlloc(size + 1);
    memcpy(str, C4SNetGetData(data), size);
    str[size] = '\0';
    return str;
  }
}
コード例 #12
0
ファイル: entity.c プロジェクト: knz/snet-rts
void SNetThreadingSpawn(snet_entity_t ent, int loc, const char *name,
                        snet_taskfun_t func, void *arg)
{
  int res;
  pthread_t p;
  pthread_attr_t attr;

  /* create snet_thread_t */
  snet_thread_t *thr = SNetMemAlloc(sizeof(snet_thread_t));
  thr->fun = func;
  pthread_mutex_init( &thr->lock, NULL );
  pthread_cond_init( &thr->pollcond, NULL );
  thr->wakeup_sd = NULL;
  thr->inarg = arg;
  thr->name = (char*) name;

  /* increment entity counter */
  pthread_mutex_lock( &entity_lock );
  entity_count += 1;
  pthread_mutex_unlock( &entity_lock );


  /* create pthread: */

  (void) pthread_attr_init( &attr);

  size_t stacksize = StackSize(ent);
  if (stacksize > 0) {
    res = pthread_attr_setstacksize(&attr, stacksize);
    if (res != 0) perror("Cannot set stack size!");
  }

  /* all threads are detached */
  res = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
  if (res != 0) perror("Cannot set detached!");

  /* spawn off thread */
  res = pthread_create( &p, &attr, &TaskWrapper, thr);
  if (res != 0) perror("Cannot create pthread!");
  pthread_attr_destroy( &attr);


  /* core affinity */
#ifdef USE_CORE_AFFINITY
  if (ent == ENTITY_other) {
    SetThreadAffinity( &p, STRICTLYFIRST);
  } else {
    SetThreadAffinity( &p, DEFAULT);
  }
#endif /* USE_CORE_AFFINITY */
}
コード例 #13
0
ファイル: SAC4SNet.c プロジェクト: riccardomc/snet-rts
static void *SAC4SNetMPIUnpackFun(void *buf)
{
  int *shape;
  SACarg *result = NULL;
  void *contents = NULL;
  int type, dims, num_elems = 1;

  SNetDistribUnpack(buf, &type, sizeof(type));
  SNetDistribUnpack(buf, &dims, sizeof(dims));
  shape = SNetMemAlloc(dims * sizeof(int));
  SNetDistribUnpack(buf, shape, dims * sizeof(int));

  for (int i = 0; i < dims; i++) {
    num_elems *= shape[i];
  }

  contents = SNetMemAlloc(num_elems * sizeOfType(type));
  SNetDistribUnpack(buf, contents, num_elems * sizeOfType(type));

  switch (type) {
    case SACint:
      result = SACARGconvertFromIntPointerVect(contents, dims, shape);
      break;
    case SACflt:
      result = SACARGconvertFromFloatPointerVect(contents, dims, shape);
      break;
    case SACdbl:
      result = SACARGconvertFromDoublePointerVect(contents, dims, shape);
      break;
    default:
      Error( "Unsupported basetype in unpack function.");
      break;
  }

  SNetMemFree(shape);

  return result;
}
コード例 #14
0
ファイル: record.c プロジェクト: stefankok/snet-rts
snet_record_t *SNetRecCopy( snet_record_t *rec)
{
  snet_record_t *new_rec;

  switch (REC_DESCR( rec)) {
    case REC_data:
      new_rec = SNetMemAlloc( sizeof( snet_record_t));
      REC_DESCR( new_rec) = REC_data;
      RECPTR( new_rec) = SNetMemAlloc( sizeof( snet_record_types_t));
      RECORD( new_rec, data_rec) = SNetMemAlloc( sizeof( data_rec_t));

      DATA_REC( new_rec, fields) = SNetRefMapCopy(DATA_REC(rec, fields));
      DATA_REC( new_rec, tags) = SNetIntMapCopy( DATA_REC( rec, tags));
      DATA_REC( new_rec, btags) = SNetIntMapCopy( DATA_REC( rec, btags));
      SNetRecSetInterfaceId( new_rec, SNetRecGetInterfaceId( rec));
      SNetRecSetDataMode( new_rec, SNetRecGetDataMode( rec));
      DATA_REC( new_rec, parent_rids) = NULL;
      /*
      (DATA_REC( rec, parent_rids)==NULL) ?
        NULL : SNetRecIdListCopy(DATA_REC( rec, parent_rids));
      */
      break;
    case REC_sort_end:
      new_rec = SNetRecCreate( REC_DESCR( rec),  SORT_E_REC( rec, level),
                               SORT_E_REC( rec, num));
      break;
    case REC_terminate:
      new_rec = SNetRecCreate( REC_terminate);
      TERM_REC(new_rec, local) = TERM_REC(rec, local);
      break;
    default:
      new_rec = NULL;
      SNetUtilDebugFatal("Can't copy record of type %d", REC_DESCR( rec));
      break;
  }

  return new_rec;
}
コード例 #15
0
ファイル: SAC4SNet.c プロジェクト: riccardomc/snet-rts
void SAC4SNet_out( void *hnd, int variant_num, ...)
{
  int i;
  void **fields;
  int *tags, *btags, name, f=0, t=0, b=0;
  snet_int_list_t *variant;
  snet_variant_t *v;
  va_list args;


  variant = SNetIntListListGet( SNetHndGetVariants( (struct handle *) hnd), variant_num-1);
  v = SNetVariantListGet( SNetHndGetVariantList( (struct handle*) hnd), variant_num-1);
  fields = SNetMemAlloc( SNetVariantNumFields( v) * sizeof( void*));
  tags = SNetMemAlloc( SNetVariantNumTags( v) * sizeof( int));
  btags = SNetMemAlloc( SNetVariantNumBTags( v) * sizeof( int));

  va_start( args, variant_num);
    for(i=0; i<SNetIntListLength( variant); i+=2) {
      name = SNetIntListGet( variant, i+1);
      switch(SNetIntListGet( variant, i)) {
        case field:
          fields[f++] =  SACARGnewReference( va_arg( args, SACarg*));
          break;
        case tag:
          tags[t++] =  va_arg( args, int);
          break;
        case btag:  
          btags[b++] =  va_arg( args, int);
          break;
        default: 
          assert(0);
      }
    }
  va_end( args);

  SNetOutRawArray( hnd, my_interface_id, v, fields, tags, btags);
}
コード例 #16
0
ファイル: split.c プロジェクト: riccardomc/snet-rts
/**
 * Convenience function for creating
 * Split, DetSplit, LocSplit or LocSplitDet,
 * dependent on parameters is_byloc and is_det
 */
snet_stream_t *CreateSplit( snet_stream_t *input,
    snet_info_t *info,
    snet_locvec_t *locvec,
    int location,
    snet_ast_t *box_a,
    int ltag, int utag,
    bool is_byloc,
    bool is_det
    )
{
  snet_info_t *newInfo = SNetInfoCopy(info);
  snet_stream_t *initial, *output;
  split_arg_t *sarg;
  snet_locvec_t *locvec;

  locvec = SNetLocvecGet(info);
  SNetLocvecSplitEnter(locvec);
  SNetLocvecSet(newInfo, SNetLocvecCopy(locvec));

  input = SNetRouteUpdate(newInfo, input, location);
  if(SNetDistribIsNodeLocation(location)) {
    initial = SNetStreamCreate(0);

    sarg = (split_arg_t *) SNetMemAlloc( sizeof( split_arg_t));
    sarg->input  = input;
    sarg->output = initial;
    sarg->boxfun = box_a;
    sarg->info = newInfo;
    sarg->ltag = ltag;
    sarg->utag = utag;
    sarg->is_det = is_det;
    sarg->is_byloc = is_byloc;
    sarg->location = location;
    SNetThreadingSpawn(
        SNetEntityCreate( ENTITY_split, location, locvec,
          "<split>", SplitBoxTask, (void*)sarg)
        );

    output = CollectorCreateDynamic( initial, location, info);

  } else {
    SNetLocvecDestroy(SNetLocvecGet(newInfo));
    SNetInfoDestroy(newInfo);
    output = input;
  }
  SNetLocvecSplitLeave(locvec);

  return output;
}
コード例 #17
0
ファイル: transmit.c プロジェクト: foliern/snet-rts
snet_msg_t SNetDistribRecvMsg(void)
{
  int count;
  snet_msg_t result;
  MPI_Status status;
  static mpi_buf_t recvBuf = {0, 0, NULL};

  MPI_Probe(MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status);
  MPI_Get_count(&status, MPI_PACKED, &count);

  MPI_Pack_size(count, MPI_PACKED, MPI_COMM_WORLD, &recvBuf.offset);
  if ((unsigned) recvBuf.offset > recvBuf.size) {
    SNetMemFree(recvBuf.data);
    recvBuf.data = SNetMemAlloc(recvBuf.offset);
    recvBuf.size = recvBuf.offset;
  }

  MPI_Recv(recvBuf.data, count, MPI_PACKED, MPI_ANY_SOURCE, status.MPI_TAG,
            MPI_COMM_WORLD, &status);

  recvBuf.offset = 0;
  result.type = status.MPI_TAG;

  switch (result.type) {
    case snet_rec:
        result.rec = SNetRecDeserialise(&recvBuf, &UnpackInt, &UnpackRef);
    case snet_block:
    case snet_unblock:
      result.dest.node = status.MPI_SOURCE;
      UnpackDest(&recvBuf, &result.dest);
      break;
    case snet_ref_set:
      result.ref = SNetRefDeserialise(&recvBuf, &UnpackInt, &UnpackByte);
      result.data = (uintptr_t) SNetInterfaceGet(SNetRefInterface(result.ref))->unpackfun(&recvBuf);
      break;
    case snet_ref_fetch:
      result.ref = SNetRefDeserialise(&recvBuf, &UnpackInt, &UnpackByte);
      result.data = status.MPI_SOURCE;
      break;
    case snet_ref_update:
      result.ref = SNetRefDeserialise(&recvBuf, &UnpackInt, &UnpackByte);
      UnpackInt(&recvBuf, 1, &result.val);
      break;
    default:
      break;
  }

  return result;
}
コード例 #18
0
ファイル: handle.c プロジェクト: stefankok/snet-rts
void SNetHndSetStringNames( snet_handle_t *hnd, int num, ...)
{
  int i;
  va_list args;

  va_start( args, num);
 
  hnd->mapping = (name_mapping_t *) SNetMemAlloc( sizeof( name_mapping_t));
  hnd->mapping->num = num;
  hnd->mapping->int_names = (int *) SNetMemAlloc( num * sizeof( int));
  hnd->mapping->string_names = (char **) SNetMemAlloc( num * sizeof( char*));

  for( i=0; i<num; i++) {
    char *str;
    int len;

    hnd->mapping->int_names[i] = va_arg( args, int);
    str = va_arg( args, char*);
    len = strlen(str)+1;
    hnd->mapping->string_names[i] = (char *) SNetMemAlloc( len * sizeof( char));
    (void) strncpy( hnd->mapping->string_names[i], str, len);
    hnd->mapping->string_names[i][len-1] = '\0';
  }
}
コード例 #19
0
ファイル: stream.c プロジェクト: stefankok/snet-rts
snet_stream_desc_t *SNetStreamOpen(snet_stream_t *stream, char mode)
{
  assert( mode=='w' || mode=='r' );
  snet_stream_desc_t *sd = SNetMemAlloc(sizeof(snet_stream_t));

  sd->stream = stream;
  sd->next = NULL;
  sd->mode = mode;
  sd->thr = SNetThreadingSelf();
  /* assign consumer or producer */
  switch(mode) {
    case 'w': stream->producer = sd; break;
    case 'r': stream->consumer = sd; break;
    default: assert(0);/*nop*/
  }
  return sd;
}
コード例 #20
0
ファイル: C4SNet.c プロジェクト: sri-prasanna/snet-rts
/* Deserializes textual data from a file. */
static c4snet_data_t *C4SNetDeserialise(FILE *file)
{
  char buf[16];
  c4snet_data_t *temp = SNetMemAlloc(sizeof(c4snet_data_t));

  temp->size = 0;
  temp->ref_count = 1;

  if (fscanf(file, "(%15[^[)][%lu])", buf, &temp->size) == 2) {
    temp->vtype = VTYPE_array;
  } else {
    temp->vtype = VTYPE_simple;
    (void) fscanf(file, ")");
  }

  int size = strlen(buf);
  if (strncmp(buf, "unsigned char", size) == 0)       temp->type = CTYPE_uchar;
  else if(strncmp(buf, "char", size) == 0)            temp->type = CTYPE_char;
  else if(strncmp(buf, "unsigned short", size) == 0)  temp->type = CTYPE_ushort;
  else if(strncmp(buf, "short", size) == 0)           temp->type = CTYPE_short;
  else if(strncmp(buf, "unsigned int", size) == 0)    temp->type = CTYPE_uint;
  else if(strncmp(buf, "int", size) == 0)             temp->type = CTYPE_int;
  else if(strncmp(buf, "unsigned long", size) == 0)   temp->type = CTYPE_ulong;
  else if(strncmp(buf, "long", size) == 0)            temp->type = CTYPE_long;
  else if(strncmp(buf, "float", size) == 0)           temp->type = CTYPE_float;
  else if(strncmp(buf, "double", size) == 0)          temp->type = CTYPE_double;
  else if(strncmp(buf, "long double", size) == 0)     temp->type = CTYPE_ldouble;
  else if(strncmp(buf, "pointer", size) == 0)         temp->type = CTYPE_pointer;
  else SNetUtilDebugFatal("[%s]: C4SNet interface encountered an unknown type.", __func__);

  if (temp->vtype == VTYPE_simple) {
    DeserialiseData(file, temp->type, &temp->data);
  } else {
    temp->data.ptr = MemAlloc(AllocatedSpace(temp));
    for (int i = 0; i < temp->size; i++) {
      if (i > 0 && fgetc(file) != ',') {
        SNetUtilDebugFatal("[%s]: Parse error deserialising data.", __func__);
      }
      DeserialiseData(file, temp->type,
                      (char*) temp->data.ptr + i * C4SNetSizeof(temp));
    }
  }

  return temp;
}
コード例 #21
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;
}
コード例 #22
0
ファイル: input.c プロジェクト: nguyenvuthiennga/snet-rts
void SNetInInputInit(FILE *file,
                     snetin_label_t *labels,
                     snetin_interface_t *interfaces,
                     snet_stream_t *in_buf
  )
{
  handle_t *hnd = SNetMemAlloc(sizeof(handle_t));

  hnd->file = file;
  hnd->labels = labels;
  hnd->interfaces = interfaces;
  hnd->buffer = in_buf;

  SNetThreadingSpawn(
      SNetEntityCreate( ENTITY_other, -2, NULL,			/* SOSI */
        "glob_input", GlobInputTask, (void*)hnd)
      );
}
コード例 #23
0
ファイル: C4SNet.c プロジェクト: sri-prasanna/snet-rts
/* Decodes binary data from a file. */
static c4snet_data_t *C4SNetDecode(FILE *file)
{
  c4snet_data_t *c = SNetMemAlloc(sizeof(c4snet_data_t));

  Base64decodeDataType(file, (int*) &c->vtype);
  Base64decode(file, &c->size, sizeof(int));
  Base64decodeDataType(file, (int*) &c->type);

  c->ref_count = 1;

  if(c->vtype == VTYPE_array) {
    c->data.ptr = MemAlloc(AllocatedSpace(c));
    Base64decode(file, c->data.ptr, AllocatedSpace(c));
  } else {
    Base64decode(file, &c->data, C4SNetSizeof(c));
  }

  return c;
}
コード例 #24
0
ファイル: C4SNet.c プロジェクト: sri-prasanna/snet-rts
/* Creates a new c4snet_data_t struct. */
c4snet_data_t *C4SNetAlloc(c4snet_type_t type, size_t size, void **data)
{
  c4snet_data_t *c = SNetMemAlloc(sizeof(c4snet_data_t));

  c->type = type;
  c->size = size;
  c->ref_count = 1;

  if (size == 1) {
    c->vtype = VTYPE_simple;
    *data = &c->data;
  } else {
    c->vtype = VTYPE_array;
    c->data.ptr = MemAlloc(AllocatedSpace(c));
    *data = c->data.ptr;
  }

  return c;
}
コード例 #25
0
ファイル: C4SNet.c プロジェクト: sri-prasanna/snet-rts
c4snet_data_t *C4SNetCreate(c4snet_type_t type, size_t size, const void *data)
{
  c4snet_data_t *c = SNetMemAlloc(sizeof(c4snet_data_t));

  c->type = type;
  c->size = size;
  c->ref_count = 1;

  if (size == 1) {
    c->vtype = VTYPE_simple;
    memcpy(&c->data, data, C4SNetSizeof(c));
  } else {
    c->vtype = VTYPE_array;
    c->data.ptr = MemAlloc(AllocatedSpace(c));
    memcpy(c->data.ptr, data, AllocatedSpace(c));
  }

  return c;
}
コード例 #26
0
ファイル: distribution.c プロジェクト: riccardomc/snet-rts
void SNetDistribZMQPack(zframe_t **dstframe, void *src, size_t count)
{
  if (*dstframe != NULL) {
    size_t src_size = count;
    size_t dstframe_size = zframe_size(*dstframe);
    byte *dstframe_data = zframe_data(*dstframe);

    byte *newsrc = SNetMemAlloc(src_size + dstframe_size);

    memcpy(newsrc, dstframe_data, dstframe_size);
    memcpy(newsrc + dstframe_size, src, src_size);

    zframe_reset(*dstframe, newsrc, dstframe_size + src_size);

    SNetMemFree(newsrc);

  } else {
    *dstframe = zframe_new(src, count);
  }
}
コード例 #27
0
ファイル: collector.c プロジェクト: foliern/snet-rts
/**
 * Collector creation function
 */
snet_stream_t *CollectorCreateDynamic( snet_stream_t *instream, int location, snet_info_t *info)
{
  snet_stream_t *outstream;
  coll_arg_t *carg;

  /* create outstream */
  outstream = SNetStreamCreate(0);

  /* create collector handle */
  carg = (coll_arg_t *) SNetMemAlloc( sizeof( coll_arg_t));
  carg->output = outstream;
  carg->is_static = false;
  CARG_DYN(carg, input) = instream;

  /* spawn collector task */
  SNetThreadingSpawn(
      SNetEntityCreate( ENTITY_collect, location, SNetLocvecGet(info),
        "<collect>", CollectorTask, (void*)carg)
      );
  return outstream;
}
コード例 #28
0
ファイル: SAC4SNet.c プロジェクト: jsyk/snet-rts
static void SAC4SNetMPIPackFun(void *sacdata, void *buf)
{
  int *shape;
  void *contents = NULL;
  SACarg *data = sacdata;
  int type, dims, num_elems = 1;

  type = SACARGgetBasetype(data);
  dims = SACARGgetDim(data);
  shape = SNetMemAlloc(dims * sizeof(int));

  for (int i = 0; i < dims; i++) {
    shape[i] = SACARGgetShape(data, i);
    num_elems *= SACARGgetShape(data, i);
  }

  SNetDistribPack(&type, buf, MPI_INT, 1);
  SNetDistribPack(&dims, buf, MPI_INT, 1);
  SNetDistribPack(shape, buf, MPI_INT, dims);

  SNetMemFree(shape);

  switch (type) {
    case SACint:
      contents = SACARGconvertToIntArray(SACARGnewReference(data));
      break;
    case SACdbl:
      contents = SACARGconvertToDoubleArray(SACARGnewReference(data));
      break;
    case SACflt:
      contents = SACARGconvertToFloatArray(SACARGnewReference(data));
      break;
    default:
      Error( "Unsupported basetype in pack function.");
      break;
  }

  SNetDistribPack(contents, buf, SAC4SNetBasetypeToMPIType(type), num_elems);
  SNetMemFree(contents);
}
コード例 #29
0
ファイル: SAC4SNet.c プロジェクト: riccardomc/snet-rts
static void *SAC4SNetDataDeserialise( FILE *file)
{
  int i;
  char buf[128], tstr[128];
  char datafile_name[128];
  FILE *datafile;

  int basetype, dim, *shape;
  SACarg *scanres, *sac_shp, *dummy;

  fscanf( file, "%s", buf); 

  if( strcmp( IDSTRINGPRE, buf) == 0) {
    fscanf( file, "%s%d", tstr, &dim);
    basetype = TstrToNum ( tstr);
    shape = SNetMemAlloc( dim * sizeof( int));
    for( i=0; i<dim; i++) {
      fscanf( file, "%d", &shape[i]);
    }
    fscanf( file, "%s", buf);
    
    /* This is a temporary workaround to avoid 
     * having two yaccs accessing the same file (which results
     * in interesting behaviour...)
     */
    fscanf( file, "%s", datafile_name);
    datafile = fopen( datafile_name, "r");
    if( datafile == NULL) {
      Error( "Failed to open datafile");
    }
    
    if( strcmp( IDSTRINGSUF, buf) == 0) {
      /* create a stub hive for the SAC calls */
      SAC_AttachHive(SAC_AllocHive(1, 2, NULL, NULL));

      sac_shp = SACARGconvertFromIntPointerVect( shape, 1, &dim);
      switch( basetype) {
        case T_int:
          SAC4SNetFibreIO__ScanIntArray2( 
              &dummy, 
              &scanres, 
              SACARGconvertFromVoidPointer( SACTYPE_StdIO_File, datafile),
              sac_shp);
          break;
        case T_double:
          SAC4SNetFibreIO__ScanDoubleArray2( 
              &dummy, 
              &scanres, 
              SACARGconvertFromVoidPointer( SACTYPE_StdIO_File, datafile),
              sac_shp);
          break;
        case T_float:
          SAC4SNetFibreIO__ScanFloatArray2( 
              &dummy, 
              &scanres, 
              SACARGconvertFromVoidPointer( SACTYPE_StdIO_File, datafile),
              sac_shp);
          break;
        default: /* unsupported base type */
            scanres = NULL;
            printf( "\n>%d<\n", basetype);
            Error("Unsupported Base Type. We only support int, float and double.");
          break;
      }
      fclose( datafile);

      /* release the stub hive */
      SAC_ReleaseHive(SAC_DetachHive());
    }
    else { /* Illegal Header Suffix */
      scanres = NULL;
      Error( "Illegal Header Suffix"); 
    }
  } 
  else { /* Illegal Header Prefix */
    scanres = NULL;
      Error( "Illegal Header Prefix"); 
  }

  return( (void*)scanres);
}
コード例 #30
0
ファイル: SAC4SNet.c プロジェクト: riccardomc/snet-rts
static void SAC4SNetDataSerialise( FILE *file, void *ptr)
{
  int i, dim;
  SACarg *ret, *arg = (SACarg*)ptr;
  char *basetype_str;
  int btype;

  btype = SACARGgetBasetype( arg);

  if( btype <= MaxTNum()) {
    basetype_str = SNetMemAlloc( 
                      (strlen( t_descr[ btype]) + 1) * sizeof( char));
    strcpy( basetype_str, t_descr[ btype]);
  } 
  else {
    basetype_str = SNetMemAlloc( 
                      (strlen( "(UDT)") + 1) * sizeof( char));
    strcpy( basetype_str, "(UDT)");
  }
   
  if( arg != NULL) { 

    dim = SACARGgetDim( arg);
    fprintf( file, "\n%s %s %d ", IDSTRINGPRE, 
                                  basetype_str, 
                                  dim);
    for( i=0; i<dim; i++) {
      fprintf( file, "%d ",SACARGgetShape( arg, i));
    }
    fprintf(file, " %s\n", IDSTRINGSUF);

    /* create a stub hive for the SAC calls */
    SAC_AttachHive(SAC_AllocHive(1, 2, NULL, NULL));

    switch( SACARGgetBasetype( arg)) {
      case T_int: 
        SAC4SNetFibreIO__PrintIntArray2( 
            &ret,
            SACARGconvertFromVoidPointer( SACTYPE_StdIO_File, file),
            SACARGnewReference( arg));
      break;
      case T_float: 
        SAC4SNetFibreIO__PrintFloatArray2( 
            &ret,
            SACARGconvertFromVoidPointer( SACTYPE_StdIO_File, file),
            SACARGnewReference( arg));
      break;
      case T_double: 
        SAC4SNetFibreIO__PrintDoubleArray2( 
            &ret,
            SACARGconvertFromVoidPointer( SACTYPE_StdIO_File, file),
            SACARGnewReference( arg));
      break;
      default:
        fprintf( file, "## UNSERIALISABLE BASETYPE (%d) ##\n", btype);
      break;
    }

    /* release the stub hive */
    SAC_ReleaseHive(SAC_DetachHive());

  }
  SNetMemFree( basetype_str);
}