/** * 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); }
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; }
void *split( void *hnd, c4snet_data_t *A, int A_width, int A_height, int nodes) { int i, first, last, block; int *new_array; c4snet_data_t *new_data; int *array = C4SNetGetData(A); block = A_height / nodes; first = 0; last = first + block - 1; for (i = 0; i < nodes - 1; i++) { new_data = C4SNetAlloc(CTYPE_int, A_width * (last - first + 1), (void **) &new_array); memcpy(new_array, (array + A_width * first), sizeof(int) * A_width * (last - first + 1)); C4SNetOut( hnd, 1, new_data, A_width, A_height, i, first, last); first = last + 1; last += block; } last = A_height - 1; new_data = C4SNetAlloc(CTYPE_int, A_width * (last - first + 1), (void **) &new_array); memcpy(new_array, (array + A_width * first), sizeof(int) * A_width * (last - first + 1)); C4SNetOut(hnd, 1, new_data, A_width, A_height, i, first, last); C4SNetFree(A); return hnd; }
/** * 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); }
void * merge (void *hnd, c4snet_data_t * atiles, c4snet_data_t * ltiles, int counter, int bs, int p, int k) { if (++counter < p - k - 1) C4SNetOut (hnd, 1, counter); else C4SNetOut (hnd, 2, atiles, ltiles, bs, p, k); return hnd; }
void * sync (void *hnd, c4snet_data_t * fatiles, c4snet_data_t * fltiles, int counter, int bs, int p, int k) { if (++counter < (p - k) * (p - k - 1) / 2) C4SNetOut (hnd, 1, counter); else C4SNetOut (hnd, 2, fatiles, fltiles, bs, p, k); return hnd; }
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; }
void *condif( void *hnd, c4snet_data_t *p) { bool bool_p = *(bool *) C4SNetGetData(p); if (bool_p) C4SNetOut(hnd, 1, 0); else C4SNetOut(hnd, 2, 0); C4SNetFree(p); return hnd; }
/* Do the InitialFactorization from input tile Fac to output tile Tri. */ void *facto(void *hnd, c4snet_data_t *Fac, int N, int B, int K) { int j; const int P = N / B; c4snet_data_t *Tri; if (verbose) { printf("%s: %p, N=%d, B=%d, (%d, , )\n", __func__, Fac, N, B, K); } if (compute) { tile_t A = (tile_t) C4SNetGetData(Fac); void *tile_ptr; c4snet_data_t *tile = C4SNetAlloc(CTYPE_double, B * B, &tile_ptr); tile_t L = (tile_t) tile_ptr; int k_b, j_b, j_bb, i_b; memset(L, 0, B * B * sizeof(double)); for (k_b = 0; k_b < B; ++k_b) { if (A[k_b + k_b * B] <= 0) { fprintf(stderr, "Not a symmetric positive definite (SPD) matrix\n"); fprintf(stderr, "K = %d, k_b = %d, B = %d, A[k_b + k_b * B] = %f\n", K, k_b, B, A[k_b + k_b * B]); exit(1); } L[k_b + k_b * B] = sqrt(A[k_b + k_b * B]); for (j_b = k_b + 1; j_b < B; ++j_b) { L[j_b + k_b * B] = A[j_b + k_b * B] / L[k_b + k_b * B]; } for (j_bb = k_b + 1; j_bb < B; ++j_bb) { for (i_b = j_bb; i_b < B; ++i_b) { A[i_b + j_bb * B] -= L[i_b + k_b * B] * L[j_bb + k_b * B]; } } } Tri = tile; C4SNetFree(Fac); } else { Tri = Fac; } for (j = K; j < P; ++j) { if (verbose) { printf("%s: -> Tri, N=%d, B=%d, (%d, %d, )\n", __func__, N, B, K, j); } C4SNetOut(hnd, 1, C4SNetShallowCopy(Tri), N, B, K, j); } /* printf("%s: -> Out, N=%d, B=%d, (%d, %d, %d)\n", __func__, N, B, K, K - 1, K - 1); */ C4SNetOut(hnd, 2, Tri, N, B, K, K - 1, K - 1); return hnd; }
void * update (void *hnd, c4snet_data_t * fatiles, c4snet_data_t * fltiles, int bs, int p, int k, int index) { tile * a_tiles = *((tile **) C4SNetGetData (fatiles)); tile * l_tiles = *((tile **) C4SNetGetData (fltiles)); int j_b, k_b, i_b; int i = index % p, j = index / p; tile l1_block = NULL, l2_block = NULL; // Diagonal tile if (i == j) l2_block = l_tiles[k * p + j]; else { l1_block = l_tiles[k * p + i]; l2_block = l_tiles[k * p + j]; } for (j_b = 0; j_b < bs; j_b++) for (k_b = 0; k_b < bs; k_b++) { double temp = -1 * l2_block[k_b * bs + j_b]; if (i != j) for (i_b = 0; i_b < bs; i_b++) a_tiles[j * p + i][j_b * bs + i_b] = a_tiles[j * p + i][j_b * bs + i_b] + temp * l1_block[k_b * bs + i_b]; else for (i_b = j_b; i_b < bs; i_b++) a_tiles[j * p + i][j_b * bs + i_b] = a_tiles[j * p + i][j_b * bs + i_b] + temp * l2_block[k_b * bs + i_b]; } C4SNetOut (hnd, 1, fatiles, fltiles, bs, p, k); return hnd; }
void * solve_s2 (void *hnd, c4snet_data_t * atiles, c4snet_data_t * ltiles, int bs, int p, int k, int j, c4snet_data_t * timestruct) { int k_b, j_b, i_b; tile restrict * restrict a_tiles = *((tile **) C4SNetGetData (atiles)); tile restrict * restrict l_tiles = *((tile **) C4SNetGetData (ltiles)); memset (l_tiles[j * p + k], 0, sizeof (double) * bs * bs); assert (j != k); for (k_b = 0; k_b < bs; k_b++) { for (i_b = 0; i_b < bs; i_b++) l_tiles[j * p + k][i_b * bs + k_b] = a_tiles[j * p + k][i_b * bs + k_b] / l_tiles[k * p + k][k_b * bs + k_b]; for (j_b = k_b + 1; j_b < bs; j_b++) for (i_b = 0; i_b < bs; i_b++) a_tiles[j * p + k][i_b * bs + j_b] = a_tiles[j * p + k][i_b * bs + j_b] - l_tiles[k * p + k][j_b * bs + k_b] * l_tiles[j * p + k][i_b * bs + k_b]; } C4SNetOut (hnd, 1, atiles, ltiles, bs, p, k, timestruct); return hnd; }
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 *), <iles), bs, p, 0); free(array); return hnd; }
void * distribute (void *hnd, c4snet_data_t * fatiles, c4snet_data_t * fltiles, int bs, int p, int k) { int i, j; for (j = k + 1; j < p; j++) for (i = k + 1; i <= j; i++) C4SNetOut (hnd, 1, fatiles, fltiles, bs, p, k, i * p + j); return hnd; }
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; }
/************ 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; }
void *subRound(void *hnd, c4snet_data_t *sd, c4snet_data_t*sk, int c, int size) { char *D = (char*) C4SNetGetData(sd); char *K = (char *) C4SNetGetData(sk); int i; for (i = 0; i < size; i++) { dround(&D[i * 8], &K[i * 7], c); } c++; C4SNetOut(hnd, 1, sd, sk, c, size); return hnd; }
void *init( void *hnd) { int *int_x; c4snet_data_t *result; result = C4SNetAlloc(CTYPE_int, X*Y, &int_x); for (int i = 0; i < X*Y; i++) int_x[i] = i; C4SNetOut(hnd, 1, result); return hnd; }
void *init( void *hnd) { int *int_x; c4snet_data_t *result; result = C4SNetAlloc(CTYPE_int, X*Y, &int_x); for (int i = 0; i < X*Y; i++) int_x[i] = i; printf("\n\n\narray is created\n\n\n"); C4SNetOut(hnd, 1, result); return hnd; }
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; }
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; }
void *addt( void *hnd, int n, int w) { int i, s; for (s = n, i = 0; i <= w; ++i) { s += n; __asm__ __volatile__ (""); } C4SNetOut(hnd, 1, n, w); return hnd; }
void * compute_s1 (void *hnd, c4snet_data_t * atiles, c4snet_data_t * ltiles, int bs, int p, int k) { int k_b, j_b, j, i_b, j_bb; tile * a_tiles = *((tile **) C4SNetGetData (atiles)); tile * l_tiles = *((tile **) C4SNetGetData (ltiles)); for (k_b = 0; k_b < bs; k_b++) { l_tiles[k * p + k][k_b * bs + k_b] = sqrt (a_tiles[k * p + k][k_b * bs + k_b]); for (j_b = k_b + 1; j_b < bs; j_b++) l_tiles[k * p + k][k_b * bs + j_b] = a_tiles[k * p + k][k_b * bs + j_b] / l_tiles[k * p + k][k_b * bs + k_b]; for (j_bb = k_b + 1; j_bb < bs; j_bb++) for (i_b = j_bb; i_b < bs; i_b++) a_tiles[k * p + k][i_b * bs + j_bb] = a_tiles[k * p + k][i_b * bs + j_bb] - l_tiles[k * p + k][k_b * bs + i_b] * l_tiles[k * p + k][k_b * bs + j_bb]; } if (k + 1 < p) for (j = k + 1; j < p; j++) C4SNetOut (hnd, 1, atiles, ltiles, bs, p, k, j); else { int i, j; C4SNetOut (hnd, 2, ltiles, bs, p); /* deallocate a_tiles array and remove atiles field. */ for (i = 0; i < p; i++) for (j = 0; j <= i; j++) free (a_tiles[j * p + i]); free (a_tiles); C4SNetFree (atiles); } return hnd; }
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; }
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; }
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); }
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; }
void *subRound(void *hnd, c4snet_data_t *sd, c4snet_data_t*sk, int c) { char *D = (char*) C4SNetGetData(sd); char *K = (char *) C4SNetGetData(sk); int i; for (i = 0; i < 8; i++) { int j; char *L = D; /* The left 4 bytes (half) of the data block. */ char *R = &(D[4]); /* The right half of the ciphertext block. */ char Rexp[6]; /* Expanded right half. */ char Rn[4]; /* New value of R, as we manipulate it. */ char SubK[6]; /* The 48-bit subkey. */ /* Generate the subkey for this round. */ KeyShift( K, KeyRotation[i + c * 8] ); Permute( SubK, K, KeyCompression, 6 ); /* Expand the right half (R) of the data block to 48 bytes, * then XOR the result with the Subkey for this round. */ Permute( Rexp, R, DataExpansion, 6 ); xor( Rexp, Rexp, SubK, 6 ); /* S-Box substitutions, P-Box permutation, and final XOR. * The S-Box substitutions return a 32-bit value, which is then * run through the 32-bit to 32-bit P-Box permutation. The P-Box * result is then XOR'd with the left-hand half of the key. * (Rexp is used as a temporary variable between the P-Box & XOR). */ sbox( Rn, Rexp ); Permute( Rexp, Rn, PBox, 4 ); xor( Rn, L, Rexp, 4 ); /* The previous R becomes the new L, * and Rn is moved into R ready for the next round. */ for( j = 0; j < 4; j++ ) { L[j] = R[j]; R[j] = Rn[j]; } } c++; C4SNetOut(hnd, 1, sd, sk, c); return hnd; }
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; }
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; }
void * update (void *hnd, c4snet_data_t * fatiles, c4snet_data_t * fltiles, int bs, int p, int k, int index, c4snet_data_t *timestruct) { tile restrict * restrict a_tiles = *((tile **) C4SNetGetData (fatiles)); tile restrict * restrict l_tiles = *((tile **) C4SNetGetData (fltiles)); int j_b, k_b, i_b; int i = index % p, j = index / p; tile l1_block, l2_block; // Diagonal tile if (i == j) l2_block = l_tiles[j * p + k]; else { l2_block = l_tiles[i * p + k]; l1_block = l_tiles[j * p + k]; } for (j_b = 0; j_b < bs; j_b++) for (k_b = 0; k_b < bs; k_b++) { double temp = -1 * l2_block[j_b * bs + k_b]; if (i != j) for (i_b = 0; i_b < bs; i_b++) a_tiles[j * p + i][i_b * bs + j_b] = a_tiles[j * p + i][i_b * bs + j_b] + temp * l1_block[i_b * bs + k_b]; else for (i_b = j_b; i_b < bs; i_b++) a_tiles[j * p + i][i_b * bs + j_b] = a_tiles[j * p + i][i_b * bs + j_b] + temp * l2_block[i_b * bs + k_b]; } C4SNetOut (hnd, 1, fatiles, fltiles, bs, p, k, timestruct); return hnd; }