我正在尝试在相邻处理器之间交换数据。使用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;
}
}