/* this function does the transformation involved in replacing an * expression */ static void replace_expression(expr_t* expr,mloop_t* mloop) { symboltable_t *new_temp; expr_t *new_expr; char *new_id = (char *)malloc(10); statement_t *body=T_MLOOP_BODY(mloop); /* drop out if replacement expr already exists */ if (find_replacement(mloop, expr)) return; /* create a new temporary variable */ sprintf(new_id,"__temp%d",idnum); new_temp = alloc_loc_st (S_VARIABLE,new_id); S_DTYPE(new_temp) = T_TYPEINFO(expr); S_VAR_INIT(new_temp) = NULL; S_INIT(new_temp) = build_init(expr,NULL); S_PROHIBITIONS(new_temp) |= TILED_OUTER_MLOOP_FLAG; new_expr = build_0ary_op(VARIABLE,new_temp); idnum++; /* replace the variable */ T_ADD_MLOOP_VAR (mloop, new_temp, T_MLOOP_ORDER(mloop, T_MLOOP_RANK(mloop)-1)); replace_expr(expr, copy_expr(new_expr)); /*add_replacement(mloop,copy_expr(expr),copy_expr(new_expr));*/ /* if necessary, reassign the variable */ if (is_written(new_expr,body)) { statement_t* post; expr_t* reassign; reassign=build_binary_op(BIASSIGNMENT,copy_expr(new_expr),copy_expr(expr)); post=build_expr_statement(reassign,T_LINENO(body),T_FILENAME(body)); T_PROHIBITIONS(post) |= TILED_OUTER_MLOOP_FLAG; T_ADD_MLOOP_POST(mloop,post,T_MLOOP_ORDER(mloop, T_MLOOP_RANK(mloop)-1)); } } /* replace_expression(expr,mloop) */
void main (int argc, char **argv) { pid_t pid; uint pte; #define SIZE (1024*1024) char buf[SIZE]; pid = fork(); //==================== SERVER ====================// if (pid == 0) { ipc_register(IPC_USER, dispatch); envid = sys_geteid(); sleep(5); return; } //==================== CLIENT ====================// envid = pid2envid(pid); yield(envid); // The "shared" memory used to communicate with the server shared_state = (arg_t *) malloc (sizeof(arg_t)); if (shared_state == NULL) { printf ("[CLIENT] Couldn't allocate shared_state memory\n"); exit(-1); } shared_state->nbytes = 12345; // touch the memory // Figure out the pte corresponding to the "shared" memory pte = sys_read_pte ((uint) shared_state, 0, sys_geteid()); if (pte == 0) { printf ("[CLIENT] Found null pte\n"); exit (-1); } // Now start the operations S_INIT(pte); { int i, t=0, rounds=atoi(argv[1]); for (i=0 ; i < rounds ; i++) { pctrval t0 = rdtsc(); S_EMPTY(0); t += (rdtsc() - t0); bzero ((void *)buf, SIZE); } printf ("%d\t%d\n", rounds, (unsigned int) t/200); } }