Advertisement
Guest User

Untitled

a guest
Feb 25th, 2017
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.21 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <mpi.h>
  3.  
  4. const int INT_0 = 0;
  5. const int INT_1 = 1;
  6.  
  7. int main(int argc, char *argv[]) {
  8.     int rank, size;
  9.  
  10.     MPI_Init(&argc, &argv);
  11.     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  12.     MPI_Comm_size(MPI_COMM_WORLD, &size);
  13.  
  14.     int info;
  15.     int ictxt, myrow, mycol;
  16.     int nprow = 2, npcol = 2;
  17.     int nb = 2;
  18.  
  19.     Cblacs_pinfo(&rank, &size);
  20.     Cblacs_get(-1, 0, &ictxt);
  21.     Cblacs_gridinit(&ictxt, "Row", nprow, npcol);
  22.     Cblacs_gridinfo(ictxt, &nprow, &npcol, &myrow, &mycol);
  23.  
  24.     if (myrow == -1 || mycol == -1) goto print;
  25.  
  26.     int M = 4, N = 4;
  27.  
  28.     int mA = numroc_(&M, &nb, &myrow, &INT_0, &nprow);
  29.     int nA = numroc_(&M, &nb, &mycol, &INT_0, &npcol);
  30.  
  31.     int descA[9];
  32.  
  33.     descinit_(descA, &M, &N, &nb, &nb, &INT_0, &INT_0, &ictxt, &mA, &info);
  34.  
  35.     double *A = (double*)malloc(mA * nA * sizeof(double));
  36.    
  37.     double *work = (double*)malloc(mA * sizeof(double));
  38.     char fn[] = "A.mat";
  39. //  pdlaread(fn, A, descA, &INT_0, &INT_0, work, strlen(fn));
  40.  
  41.     for (int i = 0; i < mA; ++i)
  42.         for (int j = 0; j < nA; ++j)
  43.             A[j*mA + i] = i*nA + j + 1;
  44.  
  45.     int mx = numroc_(&M, &nb, &myrow, &INT_0, &nprow);
  46.     int nx = numroc_(&INT_1, &nb, &mycol, &INT_0, &npcol);
  47.  
  48.     int descx[9];
  49.     descinit_(descx, &M, &INT_1, &nb, &INT_1, &INT_0, &INT_0, &ictxt, &mx, &info);
  50.  
  51.     double *x = (double*)malloc(mx * INT_1 * sizeof(double));
  52.  
  53.     int my = numroc_(&M, &nb, &myrow, &INT_0, &nprow);
  54.     int ny = numroc_(&INT_1, &nb, &mycol, &INT_0, &npcol);
  55.  
  56.     int descy[9];
  57.     descinit_(descy, &M, &INT_1, &nb, &INT_1, &INT_0, &INT_0, &ictxt, &my, &info);
  58.  
  59.     double *y = (double*)malloc(my * INT_1 * sizeof(double));
  60.  
  61.     for (int i = 0; i < mx; ++i) x[i] = 1.0;
  62.  
  63.     double alpha = 1.0, beta = 0.0;
  64.     pdgemv("N", &M, &N, &alpha, A, &INT_1, &INT_1, descA, x, &INT_1, &INT_1,
  65.                 descx, &INT_1, &beta, y, &INT_1, &INT_1, descy, &INT_1);
  66.  
  67.     double norm;
  68.     norm = pdlange("F", &M, &INT_1, y, &INT_1, &INT_1, descy, NULL);
  69. //  printf("%.6lf\n");
  70.  
  71. print:
  72.     for (int r = 0; r < size; ++r) {
  73.         if (rank == r) {
  74.             printf("------ %d ------\n", r);
  75.             printf("norma = %.6lf\n", norm);
  76.             if (nx > 0) {
  77.                 for (int i = 0; i < mx; ++i) {
  78.                     printf("%.6lf\n", y[i]);
  79.                 }
  80.             }
  81.         }
  82.         MPI_Barrier(MPI_COMM_WORLD);
  83.     }
  84.    
  85.     MPI_Finalize();
  86.  
  87.     return 0;
  88. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement