Advertisement
Guest User

mpp

a guest
Nov 18th, 2019
152
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.87 KB | None | 0 0
  1.  
  2. int main()
  3. {
  4. MPI_Status status;
  5. int nrprocese, rank;
  6. srand((time(NULL)));
  7. int rc = MPI_Init(NULL, NULL);
  8. if (rc != MPI_SUCCESS) {
  9. cout << " ERR mpi" << endl;
  10. MPI_Abort(MPI_COMM_WORLD, rc);
  11. }
  12. MPI_Comm_size(MPI_COMM_WORLD, &nrprocese);
  13. MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  14. //cout << rank << " from " << nrprocese << endl;
  15. unsigned char* number1_p = NULL;
  16. unsigned char* number2_p = NULL;
  17. int size_per_proc = digitsNo / nrprocese;
  18. unsigned char carry;
  19. unsigned char* result = (unsigned char*)malloc(sizeof(unsigned char) * digitsNo + 2);
  20. unsigned char * subset_number1 = (unsigned char*)malloc(sizeof(unsigned char) * size_per_proc);
  21. unsigned char* subset_number2 = (unsigned char*)malloc(sizeof(unsigned char) * size_per_proc);
  22. if (rank == 0) {
  23. //cout << "Root:";
  24. int digi = digitsNo;
  25. Utils u;
  26. u.newFileUpdated("file11.txt", 2, digi, digi);
  27. auto numbers = u.readFromFile("file11.txt");
  28. const auto number1 = numbers[0];
  29. const auto number2 = numbers[1];
  30. number1_p = (unsigned char*) malloc(sizeof(unsigned char) * number1.size());
  31. number2_p = (unsigned char*)malloc(sizeof(unsigned char) * number2.size());
  32. for (int i = 0; i < number1.size(); i++) {
  33. number1_p[i] = number1[i];
  34. number2_p[i] = number2[i];
  35. }
  36. carry = 0;
  37. cout << " NUMBER 1:" << convertNumberToString_v2(number1_p, number1.size()) << "\n";
  38. cout << " NUMBER 2:" << convertNumberToString_v2(number2_p, number2.size()) << "\n";
  39. MPI_Send(&carry, 1, MPI_UNSIGNED_CHAR, rank + 1, 0, MPI_COMM_WORLD);
  40. }
  41. MPI_Scatter(number1_p, size_per_proc, MPI_UNSIGNED_CHAR, subset_number1, size_per_proc, MPI_UNSIGNED_CHAR, 0, MPI_COMM_WORLD);
  42. MPI_Scatter(number2_p, size_per_proc, MPI_UNSIGNED_CHAR, subset_number2, size_per_proc, MPI_UNSIGNED_CHAR, 0, MPI_COMM_WORLD);
  43. unsigned char* sub_result = (unsigned char*)malloc(sizeof(unsigned char) * size_per_proc);
  44. cout << " Proc" << rank << "::" << convertNumberToString_v2(subset_number1, size_per_proc) << "\n";
  45. /*if (rank != 0) {
  46. for (int i = 0; i < size_per_proc; i++) {
  47. sub_result[i] = number1_p[i] + number2_p[i];
  48. }
  49. }*/
  50.  
  51. MPI_Recv(&carry,1,MPI_UNSIGNED_CHAR, rank-1,0,MPI_COMM_WORLD,&status);
  52. cout << "Carry venit:" << carry << " din proc:" << rank - 1 << "\n";
  53.  
  54. for (int i = 0; i < size_per_proc; i++) {
  55. sub_result[i] = number1_p[i] + number2_p[i] + carry;
  56. carry = sub_result[i] / 10;
  57. }
  58.  
  59. if (rank == nrprocese - 1) {
  60. MPI_Send(&carry, 1, MPI_UNSIGNED_CHAR, 0, 0, MPI_COMM_WORLD);
  61. }
  62.  
  63. MPI_Gather(sub_result, size_per_proc, MPI_UNSIGNED_CHAR, result, size_per_proc, MPI_UNSIGNED_CHAR, 0, MPI_COMM_WORLD);
  64. if (rank == 0) {
  65. cout << "Last carry is:" << carry << "\n";
  66. MPI_Recv(&carry, 1, MPI_UNSIGNED_CHAR, nrprocese - 1, 0, MPI_COMM_WORLD, &status);
  67. if (carry == 1) {
  68. result[digitsNo + 1] = 1;
  69. }
  70. cout << "RESULT:" << convertNumberToString_v2(result,digitsNo+1);
  71. }
  72. MPI_Finalize();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement