int main(void) 
{
  Item x = 5, y = 2, x2 = 6, y2 = 3;
  mat m1, m2, k1, k2;
  int i, j;

  printf("\nItems: ");
  item_print(x);
  printf(" ");
  item_print(y);
  printf("\n");
  printf("Item Addition: ");
  item_print(item_add(x, y));
  printf("\n");
  printf("Item Multiplication: ");
  item_print(item_mul(x, y));
  printf("\n");
  printf("Item Substraction: ");
  item_print(item_sub(x, y));
  printf("\n");
  printf("Item Division: ");
  item_print(item_div(x, y));
  printf("\n\n");
  m1 = mat_create(3, 2);
  m2 = mat_create(2, 3);
  k1 = mat_create(2, 2);
  k2 = mat_create(2, 2);
  for (i = 0; i < mat_rows(m1); i++)
    for (j = 0; j < mat_cols(m1); j++)
      mat_add_elem(m1, i, j, x);
  for (i = 0; i < mat_rows(m2); i++)
    for (j = 0; j < mat_cols(m2); j++)
      mat_add_elem(m2, i, j, y);
  for (i = 0; i < mat_rows(k1); i++)
    for (j = 0; j < mat_cols(k1); j++)
      {
  	mat_add_elem(k1, i, j, x2);
  	mat_add_elem(k2, i, j, y2);
      }
  printf("k1 Matrix: \n");
  mat_print(k1);
  printf("k2 Matrix: \n");
  mat_print(k2);
  printf("Addition: \n");
  mat_print(mat_add(k1, k2));
  printf("Substraction: \n");
  mat_print(mat_sub(k1, k2));
  printf("m1 Matrix: \n");
  mat_print(m1);
  printf("m2 Matrix: \n");
  mat_print(m2);
  printf("Multiplication: \n");
  mat_print(mat_mul(m1, m2));
  return 0;
}
Esempio n. 2
0
void parallel_gemv_task(CM && mat, CV && vec, CR && res) {
  int rank, nprocs;
  MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  MPI_Comm_size(MPI_COMM_WORLD, &nprocs);

  int m = (int)mat.dim0();// n = (int)mat.dim1();
  int load = m / nprocs;
  int remainder = m % nprocs;
  int max_load = load + remainder;
  int *rcounts = new int [nprocs];
  int *displs = new int [nprocs];
  int offset;
  offset = rank * load;
  
  douban::vec_container<double> y_tmp(max_load);
   
  // General matrix vector multiplication
  y_tmp = douban::gemv(mat_rows(mat, offset, offset + max_load), vec);
  
  // Prepare for MPI_Gatherv
  for(int i = 0; i < nprocs; ++i) {
    rcounts[i] = load;
    displs[i] = i * load;
  }
  if(remainder != 0)
    rcounts[nprocs - 1] = max_load;
  if(rank == nprocs - 1)
    load = max_load;

  // MPI_Gatherv
  MPI_Gatherv(&y_tmp[0], load, MPI_DOUBLE, &res[0], &rcounts[0], &displs[0], MPI_DOUBLE, 0, MPI_COMM_WORLD);
  
  delete [] rcounts;
  delete [] displs;
  
  return;
}