gpt4 book ai didi

c - 如何使用 MPI 散布二维数组?

转载 作者:行者123 更新时间:2023-12-02 03:35:52 24 4
gpt4 key购买 nike

我正在尝试使用 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]);

}
}

最佳答案

您尝试执行的操作无效,因为 MPI 始终只发送您指向的数据。它不遵循 sendArray 中的指针。

在您的示例中,您可以将 SendArray 变大,即 16 * N 并将所有数据放入该连续数组中。这样你就有了一个一维数组,但这不应该是你给我们的代码中的问题,因为所有的桶都有相同的长度,所以你可以从桶 i 访问元素 j sendArray[i * N + j]

此外,在大多数情况下,send_count 应该等于 recv_count。在您的情况下,这将是 N。正确的 MPI 调用是

MPI_Scatter(sendArray, N, MPI_INT, receiveArray, N, MPI_INT, 0, MPI_COMM_WORLD);

关于c - 如何使用 MPI 散布二维数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23507964/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com