Esempio n. 1
0
/**
 * Update state by adding inval and emitting new state and old state as output
 * if new state >= MAXVAL, a trigger is emitted instead of a new state.
 */
void *compute( void *hnd, c4snet_data_t *state, c4snet_data_t *inval)
{
  int int_state, int_newstate, int_inval;
  c4snet_data_t *data_newstate, *data_output;

  int_state = *(int *) C4SNetGetData(state);
  int_inval = *(int *) C4SNetGetData(inval);

  /* emit outval */
  data_output = C4SNetCreate(CTYPE_int, 1, &int_state);
  C4SNetOut( hnd, 1, data_output);

  /* update state */
  int_newstate = int_state + int_inval;

  if (int_newstate < MAXVAL) {
    /* emit state */
    data_newstate = C4SNetCreate(CTYPE_int, 1, &int_newstate);
    C4SNetOut( hnd, 2, data_newstate);
  } else {
    /* emit trigger */
    data_newstate = C4SNetCreate(CTYPE_int, 1, &int_newstate);
    C4SNetOut( hnd, 3, data_newstate);
  }

  C4SNetFree(state);
  C4SNetFree(inval);
  return( hnd);
}
Esempio n. 2
0
/**
 * Update state by subtracting inval.
 * Emit the previous state as outval.
 * If new state > 0, emit a new state.
 */
void *add( void *hnd, c4snet_data_t *state, c4snet_data_t *inval)
{
  int int_state, int_newstate, int_inval;
  c4snet_data_t *data_newstate, *data_output;

  int_state = *(int *) C4SNetGetData(state);
  int_inval = *(int *) C4SNetGetData(inval);

  /* update state */
  int_newstate = int_state - int_inval;

  if (int_newstate > 0) {
    data_newstate = C4SNetCreate(CTYPE_int, 1, &int_newstate);
    C4SNetOut( hnd, 1, data_newstate);
  }

  /* emit old state as output */
  data_output = C4SNetCreate(CTYPE_int, 1, &int_state);
  C4SNetOut( hnd, 2, data_output);


  C4SNetFree(state);
  C4SNetFree(inval);
  return( hnd);
}
Esempio n. 3
0
c4snet_data_t *C4SNetDeepCopy(c4snet_data_t *data)
{
  if (data->vtype == VTYPE_array) {
    return C4SNetCreate(data->type, data->size, data->data.ptr);
  }

  return C4SNetCreate(data->type, data->size, &data->data);
}
Esempio n. 4
0
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;
}
Esempio n. 5
0
void *Merger (void *hnd, c4snet_data_t *total_ele, c4snet_data_t *count, c4snet_data_t *submatrix_in_one_row, c4snet_data_t *size_matrix, c4snet_data_t *size_submatrix, c4snet_data_t *result, c4snet_data_t *submatrix_result, c4snet_data_t *position)
{
	int int_total_ele = * (int *) C4SNetGetData(total_ele);
	int int_count = * (int *) C4SNetGetData(count);

	int *int_submatrix_result = C4SNetGetData(submatrix_result);
	int *int_result = C4SNetGetData(result);

	int int_submatrix_in_one_row = * (int *) C4SNetGetData(submatrix_in_one_row);
	int int_size_matrix = * (int *) C4SNetGetData(size_matrix);
	int int_size_submatrix = * (int *) C4SNetGetData(size_submatrix);
	int int_position = * (int *) C4SNetGetData(position);

	int i, j;


	int positioni, positionj;
	int position_in_result;

	int_count = int_count + 1;

	positioni = int_position / int_submatrix_in_one_row;
	positionj = int_position % int_submatrix_in_one_row;


	for (i = 0; i < int_size_submatrix; i++)
	{
	 for (j = 0; j < int_size_submatrix; j++)
	 {
		 position_in_result = (int_size_matrix * (i + (positioni * int_size_submatrix)) + j + (positionj * int_size_submatrix));
		 int_result[position_in_result] = int_result[position_in_result] + int_submatrix_result[(int_size_submatrix * i) + j];
	 }
	}

	if ( int_count < int_total_ele)
	{

		c4snet_data_t *new_result;
		new_result = C4SNetCreate(CTYPE_int, int_size_matrix*int_size_matrix, int_result);
		C4SNetOut(hnd, 1, total_ele, C4SNetCreate(CTYPE_int, 1, &int_count), submatrix_in_one_row, size_matrix, size_submatrix, new_result);
	}
	else
	{
		printf("SOLUTION:\n");
		for (i = 0; i < int_size_matrix; i++)
		{
			for (j = 0; j < int_size_matrix; j++)
			{
				printf("%d\t", int_result[(i*int_size_matrix) + j]);
			}
			printf("\n");
		}
		C4SNetOut(hnd, 2, 0);
	}

	return hnd;
}
Esempio n. 6
0
/************ SOURCE SINK ***************/
void *source(void *hnd, int interval, int mess) {
  char pt[8] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'};
  char key[7] = {'1', '2', '3', '4', '5', '6', '7'};
  int i;
  for (i = 0; i < mess; i++) {
    C4SNetOut(hnd, 1, C4SNetCreate(CTYPE_char, 8, &pt[0]), C4SNetCreate(CTYPE_char, 7, &key[0]));
    usleep(interval);    // sleep in microseconds
  }
  return hnd;
}
Esempio n. 7
0
void *initP(void *hnd, c4snet_data_t *spt, c4snet_data_t *skey) {
  char *pt = (char *) C4SNetGetData(spt);
  char *key = (char *) C4SNetGetData(skey);
  char K[7];
  char D[8];
  Permute( K, key, KeyPermuteMap, 7 );
  Permute( D, pt, InitialPermuteMap, 8 );
  C4SNetOut(hnd, 1, C4SNetCreate(CTYPE_char, 8, &D[0]), C4SNetCreate(CTYPE_char, 7, &K[0]), 0);
  C4SNetFree(spt);
  C4SNetFree(skey);
  return hnd;
}
Esempio n. 8
0
void *merge(void *hnd, c4snet_data_t *OutFile, c4snet_data_t *Result,
            int X, c4snet_data_t *Out, int N, int B, int K, int J, int I)
{
    const int   P = N / B;

    if (verbose) {
        printf("%s: %p, %p, X=%d, %p, N=%d, B=%d, (%d, %d, %d)\n",
                __func__, OutFile, Result, X, Out, N, B, K, J, I);
    }
    if (compute) {
        c4snet_data_t **result = C4SNetGetData(Result);
        assert(result[J + I * P] == NULL);
        result[J + I * P] = Out;
    }
    if (X > 1) {
        C4SNetOut(hnd, 1, OutFile, Result, X - 1);
    }
    else if (compute) {
        struct timespec end;
        if (clock_gettime(CLOCK_REALTIME, &end)) {
            pexit("clock_gettime");
        }
        printf("Time for size %d x %d : %lf sec\n", N, N, delta_time(begin, end));
        write_matrix(Result, N, B, OutFile);
        C4SNetOut(hnd, 2, C4SNetCreate(CTYPE_char, 5, "Done."));
        C4SNetFree(OutFile);
        C4SNetFree(Result);
    }
    return hnd;
}
Esempio n. 9
0
void *initP(void *hnd, c4snet_data_t *spt, c4snet_data_t *skey, int size) {
  char *pt = (char *) C4SNetGetData(spt);
  char *key = (char *) C4SNetGetData(skey);
  char *K = (char *) SCCMallocPtr(size * 7);
  char *D = (char *) SCCMallocPtr(size * 8);
  int i;
  for (i = 0; i < size; i++) {
    Permute( &K[i * 7], key, KeyPermuteMap, 7 );
    Permute( &D[i * 8], pt, InitialPermuteMap, 8 );
  }
  C4SNetOut(hnd, 1, C4SNetCreate(CTYPE_char, 8 * size, &D[0]), C4SNetCreate(CTYPE_char, 7 * size, &K[0]), 0, size);
  C4SNetFree(spt);
  C4SNetFree(skey);
  SCCFreePtr (K);
  SCCFreePtr (D);
  return hnd;
}
Esempio n. 10
0
void *finalP(void *hnd, c4snet_data_t *sd, c4snet_data_t *sk, int c) {
  char *D = (char *) C4SNetGetData(sd);
  char E[8];
  Permute( E, D, FinalPermuteMap, 8 );
//  printbyte(E);
  C4SNetOut(hnd, 1, C4SNetCreate(CTYPE_char, 8, &E[0]));
  C4SNetFree(sd);
  C4SNetFree(sk);
  return hnd;
}
Esempio n. 11
0
void *add( void *hnd, c4snet_data_t *n, c4snet_data_t *w)
{
  int int_n = *(int *) C4SNetGetData(n);
  int int_w = *(int *) C4SNetGetData(w);

  C4SNetFree(n);
  C4SNetFree(w);

  int i, s;
  for (s = int_n, i = 0; i <= int_w; ++i)
  {
         s += int_n;
        __asm__ __volatile__ ("");
  }

  C4SNetOut(hnd, 1, C4SNetCreate(CTYPE_int, 1, &int_n), C4SNetCreate(CTYPE_int, 1, &int_w));

  return hnd;
}
Esempio n. 12
0
void *finalP(void *hnd, c4snet_data_t *sd, c4snet_data_t *sk, int c, int size) {
  char *D = (char *) C4SNetGetData(sd);
  int i;
  char *E = (char *) SCCMallocPtr(8 * size);
  for (i = 0; i < size; i++)
    Permute( &E[i * 8], &D[i * 8], FinalPermuteMap, 8 );

  //printbyte(E, size);
  C4SNetOut(hnd, 1, C4SNetCreate(CTYPE_char, size, &E[0]), size);
  C4SNetFree(sd);
  C4SNetFree(sk);
  //SCCFreePtr(E);
  return hnd;
}
Esempio n. 13
0
void *dec( void *hnd, c4snet_data_t *x)
{
  int int_x;
  c4snet_data_t *result;

  int_x= *(int *)C4SNetGetData( x);
  int_x -= 1;

  result = C4SNetCreate(CTYPE_int, 1, &int_x);

  C4SNetFree(x);

  C4SNetOut( hnd, 1, result);
  return( hnd);
}
Esempio n. 14
0
void *showB( void *hnd, c4snet_data_t *x)
{
  int int_x = *(int *)C4SNetGetData( x);
  c4snet_data_t *result;

  printf("%s: %d\n", __func__, int_x);

  result = C4SNetCreate(CTYPE_int, 1, &int_x);

  C4SNetFree(x);

  C4SNetOut( hnd, 1, result);

  return hnd;
}
Esempio n. 15
0
void *
finalize (void *hnd, c4snet_data_t * fltiles, int bs, int p)
{
    struct timespec end;
    tile * tiles = *((tile **) C4SNetGetData (fltiles));

    if (clock_gettime(CLOCK_REALTIME, &end)) {
        pexit("clock_gettime");
    }
    printf("Time for size %d x %d : %lf sec\n", bs * p, bs * p, delta_time(begin, end));
    
    write_matrix(tiles, p, bs);

    C4SNetOut (hnd, 1, C4SNetCreate (CTYPE_char, 5, "Done."));
    C4SNetFree (fltiles);
    return hnd;
}
Esempio n. 16
0
static c4snet_data_t *MPIUnpackFun(void *buf)
{
  void *tmp;
  c4snet_data_t *result;
  int vtype, type, count;

  SNetDistribUnpack(&vtype, buf, MPI_INT, 1);
  SNetDistribUnpack(&count, buf, MPI_INT, 1);
  SNetDistribUnpack(&type, buf, MPI_INT, 1);

  if (vtype == VTYPE_array) {
    result = C4SNetAlloc(type, count, &tmp);
    SNetDistribUnpack(tmp, buf, TypeToMPIType(type), count);
  } else {
    result = C4SNetCreate(type, 1, &tmp);
    SNetDistribUnpack(tmp, buf, TypeToMPIType(type), 1);
  }

  return result;
}
Esempio n. 17
0
void *algorithm( void *hnd,
                 c4snet_data_t *password,
                 c4snet_data_t *salt,
                 c4snet_data_t *dictionary,
                 int dictionary_size)
{
  struct crypt_data cdata;
  char *pw, *slt, *dict, *result;
  bool found = false;
  int i, j;

  cdata.initialized = 0;

  pw = C4SNetGetData(password);
  slt = C4SNetGetData(salt);
  dict = C4SNetGetData(dictionary);

  for (i = 0, j = 0; i < dictionary_size; i++) {
    result = crypt_r(&dict[j], slt, &cdata);

    if (!strcmp(result, pw)) {
      C4SNetOut(hnd, 1,
          C4SNetCreate(CTYPE_char, strlen(&dict[j]), &dict[j]));

      found = true;
      break;
    } else {
      j += 1 + strlen(&dict[j]);
    }
  }

  if (!found) {
    C4SNetOut(hnd, 2, 0);
  }

  C4SNetFree(password);
  C4SNetFree(salt);
  C4SNetFree(dictionary);

  return hnd;
}
Esempio n. 18
0
void *Split (void* hnd, c4snet_data_t *matrix_A, c4snet_data_t *matrix_B, c4snet_data_t *size_matrix, c4snet_data_t *division)
{
	 int *int_matrix_A  = C4SNetGetData(matrix_A);
	 int *int_matrix_B  = C4SNetGetData(matrix_B);

	 int int_size_matrix = *(int *) C4SNetGetData(size_matrix);
	 int int_division = *(int *) C4SNetGetData(division);


	 int *int_result = malloc(sizeof(int) * int_size_matrix * int_size_matrix);

	 int **int_submatrix_collect_A = malloc(sizeof(int *) * int_division);
	 int **int_submatrix_collect_B = malloc(sizeof(int *) * int_division);

	 int i, j, k, z;

	 int repetition, row, col;

	 /*if (int_division <= 0 || int_size_matrix % sqrt(int_division) != 0)
	 {
		 printf("THe number of division is not possible. ");
		 return hnd;
	 }*/

	 int submatrix_in_one_row = sqrt(int_division);
	 int size_submatrix = (int_size_matrix / sqrt(int_division));
	 int varrow = 0;
	 int varcol = 0;

	 int *int_submatrix_A;
	 int *int_submatrix_B;
	 int *int_copy_matrix_A = malloc(sizeof(int) * int_size_matrix*int_size_matrix);
	 int *int_copy_matrix_B = malloc(sizeof(int) * int_size_matrix*int_size_matrix);

	 int_submatrix_A = malloc(sizeof(int) * size_submatrix*size_submatrix);
	 int_submatrix_B = malloc(sizeof(int) * size_submatrix*size_submatrix);

	 int position;

	 for ( repetition = 0; repetition < int_size_matrix; repetition++ )
	 {
		 row = 0;
		 col = 0;

		 for (i = 0; i < int_size_matrix; i++)
		 {
			 for (j = 0; j < int_size_matrix; j++)
			 {
				 if ( (j + row + repetition) < int_size_matrix )
				 {
					 int_copy_matrix_A[(i*int_size_matrix) + j] = int_matrix_A[ ( (i * int_size_matrix) + (j + row + repetition) )];
				 }
				 else
				 {
					 int_copy_matrix_A[(i*int_size_matrix) + j] = int_matrix_A[ ( (i * int_size_matrix) + ((j + row + repetition) % int_size_matrix) )];
				 }

				 if ( ( (i*int_size_matrix) + (col * int_size_matrix) + (repetition * int_size_matrix) ) < ( int_size_matrix * int_size_matrix ) )
				 {
					 int_copy_matrix_B[(i*int_size_matrix) + j] = int_matrix_B[ j + ( (i + col + repetition ) * int_size_matrix) ];
				 }
				 else
				 {
					 int_copy_matrix_B[(i*int_size_matrix) + j] = int_matrix_B[ j + (( (i + col + repetition ) * int_size_matrix) % (int_size_matrix * int_size_matrix)) ];
				 }

				 col++;
			 }
			 row++;
		 }
		 varrow = 0;
		 varcol = 0;

		 for ( position = 0; position < int_division; position++ )
		 {
			 for (i = 0; i < size_submatrix; i++)
			 {
				 for (j = 0; j < size_submatrix; j++)
				 {
					 int_submatrix_A[(i*size_submatrix) + j] = int_copy_matrix_A[(i + (varrow * size_submatrix))*int_size_matrix + (j + (varcol * size_submatrix))];
					 int_submatrix_B[(i*size_submatrix) + j] = int_copy_matrix_B[(i + (varrow * size_submatrix))*int_size_matrix + (j + (varcol * size_submatrix))];
				 }
			 }

			 // right
			 if ( (position + 1)% (int_size_matrix/size_submatrix) == 0 )
			 {
				 varcol = 0;
				 varrow++;
			 }
			 else //down and begin
			 {
				 varcol++;
			 }

			 // send data
			 C4SNetOut(hnd, 2, C4SNetCreate (CTYPE_int, size_submatrix*size_submatrix, int_submatrix_A),
					 C4SNetCreate (CTYPE_int, size_submatrix*size_submatrix, int_submatrix_B),
					 C4SNetCreate(CTYPE_int, 1, &size_submatrix), C4SNetCreate(CTYPE_int, 1, &position));
		 }
	 }

	 // Second message
	 // int_size_matrix * int_size_matrix * submatrix_in_one_row = number of operations of submatrix
	 int total_ele = int_size_matrix * int_division;

	 int count = 0;

	 c4snet_data_t *result;
	 for (i = 0; i < int_size_matrix; i++)
	 {
		 for (j = 0; j < int_size_matrix; j++)
		 {
			 int_result[(i*int_size_matrix) + j] = 0;
		 }
	 }

	 result 	= C4SNetCreate (CTYPE_int, int_size_matrix*int_size_matrix, int_result);


	 C4SNetOut(hnd, 1, C4SNetCreate(CTYPE_int, 1, &total_ele), C4SNetCreate(CTYPE_int, 1, &count), C4SNetCreate(CTYPE_int, 1, &submatrix_in_one_row), size_matrix, C4SNetCreate(CTYPE_int, 1, &size_submatrix), result);

	return hnd;
}