MPI_Scatter 收到错误的值
MPI_Scatter is receiving wrong values
我的目标是获取一个包含 6 个整数的数组并将它们拆分到 3 个进程中。但是,receiveBuffer 中的数字不正确。我不知道为什么这三个进程不包含原始数组中的整数。
#include<stdio.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>
#include <assert.h>
#include "mpi.h"
#define ARRAY_SIZE 6
// simple print array method
void printArray(int arr[], int size)
{
int i;
for (i=0; i < size; i++)
printf("%d ", arr[i]);
printf("\n");
}
int main (int argc, char *argv[])
{
srand(time(NULL));
int array[ARRAY_SIZE];
int rank, numNodes;
// fill array with random numbers and print
for(int i = 0; i < ARRAY_SIZE; i++)
array[i] = rand();
printArray(array, ARRAY_SIZE);
MPI_Init( &argc, &argv );
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size (MPI_COMM_WORLD,&numNodes);
int receiveBuffer[ARRAY_SIZE/numNodes];
if(rank == 0)
{
MPI_Scatter(array, ARRAY_SIZE/numNodes, MPI_INT, &receiveBuffer, 0, MPI_INT, rank, MPI_COMM_WORLD);
}
printf("ID: %d with %d items.\n", rank, ARRAY_SIZE/numNodes);
printArray(receiveBuffer, ARRAY_SIZE/numNodes);
MPI_Finalize();
return 0;
}
另外,为什么每个进程打印的都是原始数组?并行化不是在 INIT 之后开始吗?
您对 MPI_Scatter()
的使用存在两个问题
MPI_Scatter()
是一个集体操作,因此必须由通信器的所有等级调用(例如,不仅是等级零)
- 由于您对发送和接收数据类型都使用
MPI_INT
,因此发送和接收计数应该相等(例如,使用 ARRAY_SIZE/numNodes
而不是 0
)
MPI 标准没有指定 MPI_Init()
之前发生的事情,并且 mpirun
产生所有任务是很常见的,所以它们都执行 MPI_Init()
之前的代码。这就是为什么 MPI_Init()
通常在 MPI 程序的最开始调用。
我的目标是获取一个包含 6 个整数的数组并将它们拆分到 3 个进程中。但是,receiveBuffer 中的数字不正确。我不知道为什么这三个进程不包含原始数组中的整数。
#include<stdio.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>
#include <assert.h>
#include "mpi.h"
#define ARRAY_SIZE 6
// simple print array method
void printArray(int arr[], int size)
{
int i;
for (i=0; i < size; i++)
printf("%d ", arr[i]);
printf("\n");
}
int main (int argc, char *argv[])
{
srand(time(NULL));
int array[ARRAY_SIZE];
int rank, numNodes;
// fill array with random numbers and print
for(int i = 0; i < ARRAY_SIZE; i++)
array[i] = rand();
printArray(array, ARRAY_SIZE);
MPI_Init( &argc, &argv );
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size (MPI_COMM_WORLD,&numNodes);
int receiveBuffer[ARRAY_SIZE/numNodes];
if(rank == 0)
{
MPI_Scatter(array, ARRAY_SIZE/numNodes, MPI_INT, &receiveBuffer, 0, MPI_INT, rank, MPI_COMM_WORLD);
}
printf("ID: %d with %d items.\n", rank, ARRAY_SIZE/numNodes);
printArray(receiveBuffer, ARRAY_SIZE/numNodes);
MPI_Finalize();
return 0;
}
另外,为什么每个进程打印的都是原始数组?并行化不是在 INIT 之后开始吗?
您对 MPI_Scatter()
MPI_Scatter()
是一个集体操作,因此必须由通信器的所有等级调用(例如,不仅是等级零)- 由于您对发送和接收数据类型都使用
MPI_INT
,因此发送和接收计数应该相等(例如,使用ARRAY_SIZE/numNodes
而不是0
)
MPI 标准没有指定 MPI_Init()
之前发生的事情,并且 mpirun
产生所有任务是很常见的,所以它们都执行 MPI_Init()
之前的代码。这就是为什么 MPI_Init()
通常在 MPI 程序的最开始调用。