【问题标题】:How do I use MPI to scatter a 2d array?如何使用 MPI 分散二维数组?
【发布时间】:2014-06-23 20:23:44
【问题描述】:

我正在尝试使用 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 = malloc(16 * N * sizeof(int));.

标签: c arrays mpi multidimensional-array


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2019-08-12
    • 1970-01-01
    • 2013-09-27
    • 1970-01-01
    • 2017-03-26
    • 1970-01-01
    • 2021-06-22
    • 1970-01-01
    相关资源
    最近更新 更多