0
我在这里有一个有趣的问题。我有一些已经排序的子数组,我需要将它们合并成一个大数组排序。我试图在下面的代码中做到这一点,但我没有得到我期待的结果。C++ MPI:数组上的std :: merge
难道你们中的一个人告诉我我做错了什么?因为我不知道,我的逻辑是看起来不错,我认为..
这里是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>
#include <algorithm>
#include <vector>
#include <iostream>
using namespace std;
#define N 32
#define ROOT 0
int A[N]; // this should be global
void quickSort(int*, int, int);
int partition(int*, int, int);
int main(int argc, char *argv[]) {
int size;
int rank;
vector<int> result(N);
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
int count = N/size;
int *localArray = (int *) malloc(count * sizeof(int));
if (rank == ROOT) {
for (int i = 0; i < N; i++) {
A[i] = rand() % 10;
}
// master local copy
for (int i = 0; i < count; i++)
localArray[i] = A[i];
for (int dest = 1; dest < size; ++dest) {
MPI_Send(&A[dest * count], count, MPI_INT, dest, 1, MPI_COMM_WORLD);
printf("P0 sent a %d elements to P%d.\n", count, dest);
}
int source = 1;
int sizeResult = count * 2;
int sizeResult2 = count;
int tmpVec[sizeResult2];
int tm[sizeResult];
MPI_Recv(tmpVec, count, MPI_INT, source, 2, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
for (int source = 2; source < size; source++) {
MPI_Recv(localArray, count, MPI_INT, source, 2, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
//-------------------------------HERE IS THE PROBLEM---------------------------
merge(tmpVec, tmpVec + sizeResult2, localArray, localArray + count, tm);
sizeResult2 = sizeResult;
for (int i = 0; i < sizeResult; i++) {
tmpVec[i] = tm[i];
cout << tm[i] << " ";
}
cout << endl;
sizeResult += count;
//-------------------------------------------------------------------------------
}
for (int i = 0; i < sizeResult2; i++)
cout << tmpVec[i] << " ";
cout << endl << sizeResult2 << endl;
for (int i = 0; i < N; i++)
cout << A[i] << " ";
}
else {
MPI_Recv(localArray, count, MPI_INT, ROOT, 1, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
quickSort(localArray, 0, count);
MPI_Send(localArray, count, MPI_INT, ROOT, 2, MPI_COMM_WORLD);
}
MPI_Finalize();
return 0;
}
void quickSort(int* A, int p, int q) {
int r;
if (p < q) {
r = partition(A, p, q);
quickSort(A, p, r);
quickSort(A, r + 1, q);
}
}
int partition(int* A, int p, int q) {
int x = A[p];
int i = p;
int j;
for (j = p + 1; j < q; j++) {
if (A[j] <= x) {
i = i + 1;
swap(A[i], A[j]);
}
}
swap(A[i], A[p]);
return i;
}
你怎么能看到的,我尝试合并第一子阵列与第二个,后我会将它们的结果与第三个合并,等等......
在这种情况下,很明显什么是错误的,但请在描述实际结果与预期结果有什么不同时更加小心。 “*我没有得到我期待的结果。*”通常是不够的。 – Zulan