Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- static void Fact(int argc, char **argv)
- {
- MPI_Init(&argc, &argv);
- int rank, size;
- MPI_Comm_rank(MPI_COMM_WORLD, &rank);
- MPI_Comm_size(MPI_COMM_WORLD, &size);
- //MPI_Group_incl()
- int rang = rank + 1;
- UINT64 currValue = rang*2*(rang*2-1);
- //cout<<"size: "<<sizeof(currValue);
- //cout << "current val: " << currValue << endl;
- UINT64 recv;
- int i = 1;
- UINT64 reserveMass[4];
- reserveMass[0] = currValue;
- while (i <= size)
- {
- if (i != 1) {
- if (rang % i == 1) // если первый, принимаем только от 1
- {
- MPI_Recv(&recv, 1, MPI_UINT64_T, rank + i / 2, i / 2, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
- currValue *= recv;
- }
- else if (rang%i == 0) // rang=i*c where c=1,..
- {
- //rang-i
- currValue = 1;
- MPI_Recv(&recv, 1, MPI_UINT64_T, rang - i, i / 2, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
- currValue *= recv;
- currValue *= ((rank / i)*i + i / 2 + 1) * 2 - 1;
- }
- else if (rang%i <= i / 2) // если не первый и за половинкой
- {
- currValue = 1;
- MPI_Recv(&recv, 1, MPI_UINT64_T, rank + i / 2, i / 2, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
- currValue *= recv;
- MPI_Recv(&recv, 1, MPI_UINT64_T, (rang / i)*i, i / 2, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
- currValue *= recv;
- }
- else if(rang%i !=0) // 12,11,10
- {
- currValue = 1;
- // приняли начальную часть
- MPI_Recv(&recv, 1, MPI_UINT64_T, (rang / i)*i, i / 2, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
- currValue *= recv;
- // здесть надо принять конец, i/2 раз
- // rang%i==0
- //MPI_Recv(&recv, 1, MPI_UINT64_T, (rang / i + 1)*i - 1, i / 2, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
- //currValue *= recv;
- int reserveValue;
- if (rang%i <= i/2 + i / 4)
- {
- reserveValue = reserveMass[((int)log2(double(i))) - 2];
- //cout<<"i: "<<i << " rang: " << rang<<endl;
- }
- else {
- //cout << "recvest";
- MPI_Recv(&recv, 1, MPI_UINT64_T, rank - (i / 4), i / 2, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
- reserveValue = recv;
- //for (int j = 0; j < (i / 2) - rank%(i/2); j++)
- //{
- // //reserveValue *= reserveMass[(rank/i)*i + i / 2 + j];
- // reserveValue *= ((rank / i)*i + i / 2 +1)*2 - 1 + j;
- //}
- }
- currValue *= reserveValue;
- }
- reserveMass[((int)log2(double(i)))] = currValue;
- }
- if (i != size) {
- if (rang % (i * 2) == 1)
- for (int j = 1; j < i * 2; j++)
- {
- MPI_Send(&currValue, 1, MPI_UINT64_T, rank + j, i, MPI_COMM_WORLD);
- //cout << "i: " << i << ", send from " << rang << " to " << rang + j << endl;
- }
- else if (rang % (i * 2) > i)
- {
- MPI_Send(&currValue, 1, MPI_UINT64_T, rank - i, i, MPI_COMM_WORLD);
- //cout << "i: " << i << ", send from " << rang << " to " << rang - i << endl;
- if (rang % (i) == 1 && i>2) {
- //cout << "send: " << reserveMass[((int)log2(double(i))) - 2] << " i:"<<i<< " "<<"rang: "<<rang<<endl;
- MPI_Send(&reserveMass[((int)log2(double(i))) - 2], 1, MPI_UINT64_T, rank + i / 2, i, MPI_COMM_WORLD);
- }
- }
- else if (rang % (i * 2) == 0)
- MPI_Send(&currValue, 1, MPI_UINT64_T, rank - i, i, MPI_COMM_WORLD);
- //for (int j = 0; j <= i; j++)
- //{
- // //cout << "i: " << i << ", send from " << rang << " to " << rang - i + j << endl;
- // currValue = currValue / (i * 4 * (rang / (i * 2)) - (j+i-1));
- // //cout << "i: " << i << ", rang: " << rang << ", special current value: " << currValue << endl;
- //}
- }
- if (rang <= i)
- cout << "Fact(" << i * 2 - rank << ") = " << currValue<<endl;
- i *= 2;
- //cout << "i: " << i / 2 << ", rang: " << rang << ", current value: " << currValue << endl;
- //cout << "7";
- }
- MPI_Finalize();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement