如何在并行编程中处理MPI_Sendrecv中的死锁?

时间:2019-09-30 03:28:11

标签: c++ parallel-processing mpi

我正在尝试在相邻处理器之间交换数据。使用mpi_sendrecv解决问题时,出现了死锁。

我正在执行并行的奇偶转置排序。但是在这种情况下,我必须对每个处理器进行奇偶排序,并比较相邻处理器之间剩余的数字。

if (num_elements_proc % 2 == 0) {

            int recv_num_1;
            int recv_num_2;
            int send_num_1;
            int send_num_2;
            MPI_Status status;
            // Perform Bubble sort on odd indexed element 
            for (int i = 1; i <= num_elements_proc - 2; i = i + 2) 
            { 
                if (sub_nums[i] > sub_nums[i+1]) {  
                    swap(sub_nums[i], sub_nums[i+1]); 
                    isSorted = false; 
                }

                send_num_1 = sub_nums[0];
                if (rank == root) {
                    MPI_Sendrecv(&send_num_1, 1, MPI_INT, m - 1, 1, &recv_num_1, 1, MPI_INT, m - 1, 1, comm, &status);
                } else {
                    MPI_Sendrecv(&send_num_1, 1, MPI_INT, rank - 1, 1, &recv_num_1, 1, MPI_INT, rank - 1, 1, comm, &status);
                }
                if (recv_num_1 > send_num_1) {
                    sub_nums[0] = recv_num_1;
                    isSorted = false;
                }
                send_num_2 = sub_nums[num_elements_proc-1];
                if (rank == m - 1) {
                    MPI_Sendrecv(&send_num_2, 1, MPI_INT, root, 1, &recv_num_2, 1, MPI_INT, root, 1, comm, &status);
                } else {
                    MPI_Sendrecv(&send_num_2, 1, MPI_INT, rank + 1, 1, &recv_num_2, 1, MPI_INT, rank + 1, 1, comm,&status);
                }
                if (send_num_2 > recv_num_2) {
                    sub_nums[num_elements_proc-1] = recv_num_2;
                    isSorted = false;
                }
            }

            // Perform Bubble sort on even indexed element 
            for (int i = 0; i <= num_elements_proc - 2; i = i + 2) 
            { 
                if (sub_nums[i] > sub_nums[i+1]) 
                { 
                    swap(sub_nums[i], sub_nums[i+1]); 
                    isSorted = false; 
                } 
            }

0 个答案:

没有答案
相关问题