Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- int main()
- {
- MPI_Status status;
- int nrprocese, rank;
- srand((time(NULL)));
- int rc = MPI_Init(NULL, NULL);
- if (rc != MPI_SUCCESS) {
- cout << " ERR mpi" << endl;
- MPI_Abort(MPI_COMM_WORLD, rc);
- }
- MPI_Comm_size(MPI_COMM_WORLD, &nrprocese);
- MPI_Comm_rank(MPI_COMM_WORLD, &rank);
- //cout << rank << " from " << nrprocese << endl;
- unsigned char* number1_p = NULL;
- unsigned char* number2_p = NULL;
- int size_per_proc = digitsNo / nrprocese;
- unsigned char carry;
- unsigned char* result = (unsigned char*)malloc(sizeof(unsigned char) * digitsNo + 2);
- unsigned char * subset_number1 = (unsigned char*)malloc(sizeof(unsigned char) * size_per_proc);
- unsigned char* subset_number2 = (unsigned char*)malloc(sizeof(unsigned char) * size_per_proc);
- if (rank == 0) {
- //cout << "Root:";
- int digi = digitsNo;
- Utils u;
- u.newFileUpdated("file11.txt", 2, digi, digi);
- auto numbers = u.readFromFile("file11.txt");
- const auto number1 = numbers[0];
- const auto number2 = numbers[1];
- number1_p = (unsigned char*) malloc(sizeof(unsigned char) * number1.size());
- number2_p = (unsigned char*)malloc(sizeof(unsigned char) * number2.size());
- for (int i = 0; i < number1.size(); i++) {
- number1_p[i] = number1[i];
- number2_p[i] = number2[i];
- }
- carry = 0;
- cout << " NUMBER 1:" << convertNumberToString_v2(number1_p, number1.size()) << "\n";
- cout << " NUMBER 2:" << convertNumberToString_v2(number2_p, number2.size()) << "\n";
- MPI_Send(&carry, 1, MPI_UNSIGNED_CHAR, rank + 1, 0, MPI_COMM_WORLD);
- }
- MPI_Scatter(number1_p, size_per_proc, MPI_UNSIGNED_CHAR, subset_number1, size_per_proc, MPI_UNSIGNED_CHAR, 0, MPI_COMM_WORLD);
- MPI_Scatter(number2_p, size_per_proc, MPI_UNSIGNED_CHAR, subset_number2, size_per_proc, MPI_UNSIGNED_CHAR, 0, MPI_COMM_WORLD);
- unsigned char* sub_result = (unsigned char*)malloc(sizeof(unsigned char) * size_per_proc);
- cout << " Proc" << rank << "::" << convertNumberToString_v2(subset_number1, size_per_proc) << "\n";
- /*if (rank != 0) {
- for (int i = 0; i < size_per_proc; i++) {
- sub_result[i] = number1_p[i] + number2_p[i];
- }
- }*/
- MPI_Recv(&carry,1,MPI_UNSIGNED_CHAR, rank-1,0,MPI_COMM_WORLD,&status);
- cout << "Carry venit:" << carry << " din proc:" << rank - 1 << "\n";
- for (int i = 0; i < size_per_proc; i++) {
- sub_result[i] = number1_p[i] + number2_p[i] + carry;
- carry = sub_result[i] / 10;
- }
- if (rank == nrprocese - 1) {
- MPI_Send(&carry, 1, MPI_UNSIGNED_CHAR, 0, 0, MPI_COMM_WORLD);
- }
- MPI_Gather(sub_result, size_per_proc, MPI_UNSIGNED_CHAR, result, size_per_proc, MPI_UNSIGNED_CHAR, 0, MPI_COMM_WORLD);
- if (rank == 0) {
- cout << "Last carry is:" << carry << "\n";
- MPI_Recv(&carry, 1, MPI_UNSIGNED_CHAR, nrprocese - 1, 0, MPI_COMM_WORLD, &status);
- if (carry == 1) {
- result[digitsNo + 1] = 1;
- }
- cout << "RESULT:" << convertNumberToString_v2(result,digitsNo+1);
- }
- MPI_Finalize();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement