Advertisement
Guest User

fact

a guest
Nov 12th, 2018
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.72 KB | None | 0 0
  1. static void Fact(int argc, char **argv)
  2. {
  3.     MPI_Init(&argc, &argv);
  4.     int rank, size;
  5.  
  6.     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  7.     MPI_Comm_size(MPI_COMM_WORLD, &size);
  8.     //MPI_Group_incl()
  9.     int rang = rank + 1;
  10.     UINT64 currValue = rang*2*(rang*2-1);
  11.     //cout<<"size: "<<sizeof(currValue);
  12.     //cout << "current val: " << currValue << endl;
  13.     UINT64 recv;
  14.     int i = 1;
  15.     UINT64 reserveMass[4];
  16.     reserveMass[0] = currValue;
  17.     while (i <= size)
  18.     {
  19.  
  20.         if (i != 1) {
  21.             if (rang % i == 1) // если первый, принимаем только от 1
  22.             {
  23.                 MPI_Recv(&recv, 1, MPI_UINT64_T, rank + i / 2, i / 2, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
  24.                 currValue *= recv;
  25.             }
  26.             else if (rang%i == 0) // rang=i*c where c=1,..
  27.             {
  28.                 //rang-i
  29.                 currValue = 1;
  30.                 MPI_Recv(&recv, 1, MPI_UINT64_T, rang - i, i / 2, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
  31.                 currValue *= recv;
  32.                 currValue *= ((rank / i)*i + i / 2 + 1) * 2 - 1;
  33.             }
  34.             else if (rang%i <= i / 2) // если не первый и за половинкой
  35.             {
  36.                 currValue = 1;
  37.                 MPI_Recv(&recv, 1, MPI_UINT64_T, rank + i / 2, i / 2, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
  38.                 currValue *= recv;
  39.                 MPI_Recv(&recv, 1, MPI_UINT64_T, (rang / i)*i, i / 2, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
  40.                 currValue *= recv;
  41.             }
  42.            
  43.             else if(rang%i !=0) // 12,11,10
  44.             {
  45.                 currValue = 1;
  46.                 // приняли начальную часть
  47.                 MPI_Recv(&recv, 1, MPI_UINT64_T, (rang / i)*i, i / 2, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
  48.                 currValue *= recv;
  49.                 // здесть надо принять конец, i/2 раз
  50.                 // rang%i==0
  51.                 //MPI_Recv(&recv, 1, MPI_UINT64_T, (rang / i + 1)*i - 1, i / 2, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
  52.                 //currValue *= recv;
  53.                 int reserveValue;
  54.                 if (rang%i <= i/2 + i / 4)
  55.                 {
  56.                     reserveValue = reserveMass[((int)log2(double(i))) - 2];
  57.                     //cout<<"i: "<<i << " rang: " << rang<<endl;
  58.                 }
  59.                 else {
  60.                     //cout << "recvest";
  61.                     MPI_Recv(&recv, 1, MPI_UINT64_T, rank - (i / 4), i / 2, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
  62.                     reserveValue = recv;
  63.                     //for (int j = 0; j < (i / 2) - rank%(i/2); j++)
  64.                     //{
  65.                     //  //reserveValue *= reserveMass[(rank/i)*i + i / 2 + j];
  66.                     //  reserveValue *= ((rank / i)*i + i / 2 +1)*2 - 1 + j;
  67.                     //}
  68.                 }
  69.                 currValue *= reserveValue;
  70.                
  71.             }
  72.             reserveMass[((int)log2(double(i)))] = currValue;
  73.         }
  74.         if (i != size) {
  75.  
  76.             if (rang % (i * 2) == 1)
  77.                 for (int j = 1; j < i * 2; j++)
  78.                 {
  79.                     MPI_Send(&currValue, 1, MPI_UINT64_T, rank + j, i, MPI_COMM_WORLD);
  80.                     //cout << "i: " << i << ", send from " << rang << " to " << rang + j << endl;
  81.                 }
  82.             else if (rang % (i * 2) > i)
  83.             {
  84.                 MPI_Send(&currValue, 1, MPI_UINT64_T, rank - i, i, MPI_COMM_WORLD);
  85.                 //cout << "i: " << i << ", send from " << rang << " to " << rang - i << endl;
  86.                 if (rang % (i) == 1 && i>2) {
  87.                     //cout << "send: " << reserveMass[((int)log2(double(i))) - 2] << " i:"<<i<< " "<<"rang: "<<rang<<endl;
  88.                     MPI_Send(&reserveMass[((int)log2(double(i))) - 2], 1, MPI_UINT64_T, rank + i / 2, i, MPI_COMM_WORLD);
  89.                 }
  90.             }
  91.             else if (rang % (i * 2) == 0)
  92.                 MPI_Send(&currValue, 1, MPI_UINT64_T, rank - i, i, MPI_COMM_WORLD);
  93.                 //for (int j = 0; j <= i; j++)
  94.                 //{
  95.                 //  //cout << "i: " << i << ", send from " << rang << " to " << rang - i + j << endl;
  96.                 //  currValue = currValue / (i * 4 * (rang / (i * 2)) - (j+i-1));
  97.                 //  //cout << "i: " << i << ", rang: " << rang << ", special current value: " << currValue << endl;
  98.                 //}
  99.         }
  100.  
  101.         if (rang <= i)
  102.             cout << "Fact(" << i * 2 - rank << ") = " << currValue<<endl;
  103.         i *= 2;
  104.         //cout << "i: " << i / 2 << ", rang: " << rang << ", current value: " << currValue << endl;
  105.         //cout << "7";
  106.     }
  107.     MPI_Finalize();
  108. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement