我只是在学习 OpenMPI。尝试了一个简单的MPI_Scatter
例子:
#include <mpi.h>
using namespace std;
int main() {
int numProcs, rank;
MPI_Init(NULL, NULL);
MPI_Comm_size(MPI_COMM_WORLD, &numProcs);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
int* data;
int num;
data = new int[5];
data[0] = 0;
data[1] = 1;
data[2] = 2;
data[3] = 3;
data[4] = 4;
MPI_Scatter(data, 5, MPI_INT, &num, 5, MPI_INT, 0, MPI_COMM_WORLD);
cout << rank << " recieved " << num << endl;
MPI_Finalize();
return 0;
}
但它并没有按预期工作......
我期待类似的东西
0 received 0
1 received 1
2 received 2 ...
但我得到的是
32609 received
1761637486 received
1 received
33 received
1601007716 received
奇怪的排名是怎么回事?似乎和我的分散有关?另外,为什么sendcount
和recvcount
一样?起初我想既然我将 5 个元素分散到 5 个处理器,每个处理器会得到 1 个?所以我应该使用:
MPI_Scatter(data, 5, MPI_INT, &num, 1, MPI_INT, 0, MPI_COMM_WORLD);
但这给出了一个错误:
[JM:2861] *** An error occurred in MPI_Scatter
[JM:2861] *** on communicator MPI_COMM_WORLD
[JM:2861] *** MPI_ERR_TRUNCATE: message truncated
[JM:2861] *** MPI_ERRORS_ARE_FATAL: your MPI job will now abort
我想知道,为什么我需要区分根进程和子进程?似乎在这种情况下,源/根也会得到一个副本?另一件事是其他进程也会分散运行吗?可能不是,但为什么呢?我认为所有进程都会运行此代码,因为如果我在 MPI 程序中看到它不是典型的?
if (rank == xxx) {
更新
我注意到运行,发送和接收缓冲区的长度必须相同......并且数据应该声明为:
int data[5][5] = { {0}, {5}, {10}, {3}, {4} };
注意列被声明为长度 5 但我只初始化了 1 个值?这里实际发生了什么?这段代码正确吗?假设我只希望每个进程只接收 1 个值。