void sor (float **current_ptr, float **next_ptr) { int i, j, my_start, my_end, my_num_rows; float *U_Curr_Above = (float *) shmalloc ((sizeof (float)) * ((int) floor (WIDTH / H))); /* 1d array holding values from bottom row of PE above */ float *U_Curr_Below = (float *) shmalloc ((sizeof (float)) * ((int) floor (WIDTH / H))); /* 1d array holding values from top row of PE below */ float *U_Send_Buffer = (float *) shmalloc ((sizeof (float)) * ((int) floor (WIDTH / H))); /* 1d array holding values that are currently being sent */ //float U_Curr_Above[(int)floor(WIDTH/H)]; /* 1d array holding values from bottom row of PE above */ //float U_Curr_Below[(int)floor(WIDTH/H)]; /* 1d array holding values from top row of PE below */ //float U_Send_Buffer[(int)floor(WIDTH/H)]; /* 1d array holding values that are currently being sent */ float W = 1.5; //MPI_Request request; //MPI_Status status; //MPI_Comm_size(MPI_COMM_WORLD,&p); //MPI_Comm_rank(MPI_COMM_WORLD,&my_rank); my_start = get_start (my_rank); my_end = get_end (my_rank); my_num_rows = get_num_rows (my_rank); /* * Communicating ghost rows - only bother if p > 1 */ if (p > 1) { /* send/receive bottom rows */ if (my_rank < (p - 1)) { /* populate send buffer with bottow row */ for (i = 0; i < (int) floor (WIDTH / H); i++) { U_Send_Buffer[i] = current_ptr[my_num_rows - 1][i]; } /* non blocking send */ //MPI_Isend(U_Send_Buffer,(int)floor(WIDTH/H),MPI_FLOAT,my_rank+1,0,MPI_COMM_WORLD,&request); shmem_float_put (U_Curr_Above, U_Send_Buffer, (int) floor (WIDTH / H), my_rank + 1); } //if (my_rank > ROOT) { /* blocking receive */ //MPI_Recv(U_Curr_Above,(int)floor(WIDTH/H),MPI_FLOAT,my_rank-1,0,MPI_COMM_WORLD,&status); //} //MPI_Barrier(MPI_COMM_WORLD); shmem_barrier_all (); /* send/receive top rows */ if (my_rank > ROOT) { /* populate send buffer with top row */ for (i = 0; i < (int) floor (WIDTH / H); i++) { U_Send_Buffer[i] = current_ptr[0][i]; } /* non blocking send */ //MPI_Isend(U_Send_Buffer,(int)floor(WIDTH/H),MPI_FLOAT,my_rank-1,0,MPI_COMM_WORLD,&request); shmem_float_put (U_Curr_Below, U_Send_Buffer, (int) floor (WIDTH / H), my_rank - 1); } //if (my_rank < (p-1)) { /* blocking receive */ //MPI_Recv(U_Curr_Below,(int)floor(WIDTH/H),MPI_FLOAT,my_rank+1,0,MPI_COMM_WORLD,&status); //} //MPI_Barrier(MPI_COMM_WORLD); shmem_barrier_all (); } /* solve next reds (i+j odd) */ for (j = my_start; j <= my_end; j++) { for (i = 0; i < (int) floor (WIDTH / H); i++) { if ((i + j) % 2 != 0) { next_ptr[j - my_start][i] = get_val_par (U_Curr_Above, current_ptr, U_Curr_Below, my_rank, i, j) + (W / 4) * (get_val_par (U_Curr_Above, current_ptr, U_Curr_Below, my_rank, i - 1, j) + get_val_par (U_Curr_Above, current_ptr, U_Curr_Below, my_rank, i + 1, j) + get_val_par (U_Curr_Above, current_ptr, U_Curr_Below, my_rank, i, j - 1) + get_val_par (U_Curr_Above, current_ptr, U_Curr_Below, my_rank, i, j + 1) - 4 * (get_val_par (U_Curr_Above, current_ptr, U_Curr_Below, my_rank, i, j)) - (pow (H, 2) * f (i, j))); enforce_bc_par (next_ptr, my_rank, i, j); } } } /* solve next blacks (i+j) even .... using next reds */ for (j = my_start; j <= my_end; j++) { for (i = 0; i < (int) floor (WIDTH / H); i++) { if ((i + j) % 2 == 0) { next_ptr[j - my_start][i] = get_val_par (U_Curr_Above, current_ptr, U_Curr_Below, my_rank, i, j) + (W / 4) * (get_val_par (U_Curr_Above, next_ptr, U_Curr_Below, my_rank, i - 1, j) + get_val_par (U_Curr_Above, next_ptr, U_Curr_Below, my_rank, i + 1, j) + get_val_par (U_Curr_Above, next_ptr, U_Curr_Below, my_rank, i, j - 1) + get_val_par (U_Curr_Above, next_ptr, U_Curr_Below, my_rank, i, j + 1) - 4 * (get_val_par (U_Curr_Above, next_ptr, U_Curr_Below, my_rank, i, j)) - (pow (H, 2) * f (i, j))); enforce_bc_par (next_ptr, my_rank, i, j); } } } shfree(U_Send_Buffer); shfree(U_Curr_Below); shfree(U_Curr_Above); }
void jacobi (float ** current_ptr,float ** next_ptr) { int i,j,p,my_rank,my_start,my_end,my_num_rows; float U_Curr_Above[(int)floor(WIDTH/H)]; /* 1d array holding values from bottom row of PE above */ float U_Curr_Below[(int)floor(WIDTH/H)]; /* 1d array holding values from top row of PE below */ float U_Send_Buffer[(int)floor(WIDTH/H)]; /* 1d array holding values that are currently being sent */ MPI_Request request; MPI_Status status; MPI_Comm_size(MPI_COMM_WORLD,&p); MPI_Comm_rank(MPI_COMM_WORLD,&my_rank); my_start = get_start(my_rank); my_end = get_end(my_rank); my_num_rows = get_num_rows(my_rank); /* * Communicating ghost rows - only bother if p > 1 */ if (p > 1) { /* send/receive bottom rows */ if (my_rank < (p-1)) { /* populate send buffer with bottow row */ for (i=0;i<(int)floor(WIDTH/H);i++) { U_Send_Buffer[i] = current_ptr[my_num_rows-1][i]; } /* non blocking send */ MPI_Isend(U_Send_Buffer,(int)floor(WIDTH/H),MPI_FLOAT,my_rank+1,0,MPI_COMM_WORLD,&request); } if (my_rank > ROOT) { /* blocking receive */ MPI_Recv(U_Curr_Above,(int)floor(WIDTH/H),MPI_FLOAT,my_rank-1,0,MPI_COMM_WORLD,&status); } MPI_Barrier(MPI_COMM_WORLD); /* send/receive top rows */ if (my_rank > ROOT) { /* populate send buffer with top row */ for (i=0;i<(int)floor(WIDTH/H);i++) { U_Send_Buffer[i] = current_ptr[0][i]; } /* non blocking send */ MPI_Isend(U_Send_Buffer,(int)floor(WIDTH/H),MPI_FLOAT,my_rank-1,0,MPI_COMM_WORLD,&request); } if (my_rank < (p-1)) { /* blocking receive */ MPI_Recv(U_Curr_Below,(int)floor(WIDTH/H),MPI_FLOAT,my_rank+1,0,MPI_COMM_WORLD,&status); } MPI_Barrier(MPI_COMM_WORLD); } /* Jacobi method using global addressing */ for (j=my_start;j<=my_end;j++) { for (i=0;i<(int)floor(WIDTH/H);i++) { next_ptr[j-my_start][i] = .25*(get_val_par(U_Curr_Above,current_ptr,U_Curr_Below,my_rank,i-1,j) + get_val_par(U_Curr_Above,current_ptr,U_Curr_Below,my_rank,i+1,j) + get_val_par(U_Curr_Above,current_ptr,U_Curr_Below,my_rank,i,j-1) + get_val_par(U_Curr_Above,current_ptr,U_Curr_Below,my_rank,i,j+1) - (pow(H,2)*f(i,j))); enforce_bc_par(next_ptr,my_rank,i,j); } } }