我正在尝试使用MPI来分配铲斗排序的工作。当我分散数组时,我希望每个进程都接收一个桶(int数组)并能够打印其内容。但是,我当前的程序打印出不正确的值,这让我觉得我没有索引到我想要的内存。有人可以帮助解释我如何正确索引到我传递给每个进程的数组或我如何错误地执行此操作?
#define MAX_VALUE 64
#define N 32
main(int argc, char *argv[]){
MPI_Init(&argc, &argv); //initialize MPI environment
int** sendArray = malloc(16*sizeof(int *));
int *arrayIndex = (int *) malloc(16*sizeof(int));
int *receiveArray = (int *) malloc(N*sizeof(int));
int nps, myrank;
MPI_Comm_size(MPI_COMM_WORLD, &nps);
MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
int i;
if(myrank == 0)
{
//create an array that stores the number of values in each bucket
for( i = 0; i < 16; i++){
arrayIndex[i] = 0;
}
int bucket =0;
int temp = 0;
//creates an int array within each array index of sendArray
for( i = 0; i < 16; i++){
sendArray[i] = (int *)malloc(N * sizeof(int));
}
//Create a random int array with values ranging from 0 to MAX_VALUE
for(i = 0; i < N; i++){
temp= rand() % MAX_VALUE;
bucket = temp/4;
printf("assigning %d to index [%d][%d]\n", temp, bucket, arrayIndex[bucket]);
sendArray[bucket][arrayIndex[bucket]]= temp;
arrayIndex[bucket] = arrayIndex[bucket] + 1;
}
MPI_Scatter(sendArray, 16, MPI_INT, receiveArray, N, MPI_INT, 0, MPI_COMM_WORLD);
MPI_Bcast(arrayIndex, 16, MPI_INT, 0, MPI_COMM_WORLD);
printf("bucket %d has %d values\n", myrank, arrayIndex[myrank]);
for( i = 0; i < arrayIndex[myrank]; i++){
printf("bucket %d index %d has value %d\n", myrank, i, receiveArray[i]);
}
}
答案 0 :(得分:1)
您尝试做的事情不起作用,因为MPI始终只发送您指向的数据。它不遵循sendArray
中的指针。
在您的示例中,您可以使SendArray更大,即16 * N
并将所有数据放入该连续数组中。这样你就有了一维数组,但这不应该是你给我们的代码中的一个问题因为所有的桶都有相同的长度,所以你可以用j
来访问i
个元素sendArray[i * N + j]
{1}}。
此外,在大多数情况下,send_count
应该等于recv_count
。在你的情况下,N
。正确的MPI调用将是
MPI_Scatter(sendArray, N, MPI_INT, receiveArray, N, MPI_INT, 0, MPI_COMM_WORLD);