- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在学习 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
不过我想知道,为什么我需要区分根进程和子进程?似乎在这种情况下,source/root 也会得到一份拷贝?另一件事是其他进程也会分散运行吗?可能不是,但为什么呢?我认为所有进程都会运行此代码,因为如果我在 MPI 程序中看到它不是典型的?
if (rank == xxx) {
更新
我注意到要运行,发送和接收缓冲区必须具有相同的长度......并且数据应该声明如下:
int data[5][5] = { {0}, {5}, {10}, {3}, {4} };
注意列被声明为长度 5 但我只初始化了 1 个值?这里到底发生了什么?这段代码正确吗?假设我只希望每个进程只接收 1 个值。
最佳答案
sendcount
是您要发送到每个 进程的元素数,而不是发送缓冲区中的元素数。 MPI_Scatter
只会从根进程的发送缓冲区中获取 sendcount
* [通信器中的进程数] 元素,并将其分散到通信器中的所有进程。
因此要向通信器中的每个进程发送 1 个元素(假设有 5 个进程),请将 sendcount
和 recvcount
设置为 1。
MPI_Scatter(data, 1, MPI_INT, &num, 1, MPI_INT, 0, MPI_COMM_WORLD);
对可能的数据类型对有限制,它们与点对点操作相同。 recvtype
的类型映射应该与 sendtype
的类型映射兼容,即它们应该具有相同的底层基本数据类型列表。此外,接收缓冲区应该足够大以容纳接收到的消息(它可能更大,但不能更小)。在大多数简单的情况下,发送端和接收端的数据类型是相同的。所以 sendcount
- recvcount
对和 sendtype
- recvtype
对通常以相同的方式结束。它们可能不同的一个例子是在任一侧使用用户定义的数据类型:
MPI_Datatype vec5int;
MPI_Type_contiguous(5, MPI_INT, &vec5int);
MPI_Type_commit(&vec5int);
MPI_Scatter(data, 5, MPI_INT, local_data, 1, vec5int, 0, MPI_COMM_WORLD);
这是有效的,因为发送方构造了类型为 MPI_INT
的 5 个元素的消息,而每个接收方都将消息解释为 5 元素整数 vector 的单个实例。
(请注意,您在MPI_Recv
中指定了要接收的最大元素数,实际接收的数量可能会更少,可以通过MPI_Get_count
获取。相比之下,您在 MPI_Scatter
的 recvcount
中提供了预期的元素数量,因此如果接收到的消息长度不是完全和 promise 的一样。)
可能你现在知道打印出来的奇怪排名是由堆栈损坏引起的,因为 num
只能包含 1 int
但 5 int
在 MPI_Scatter
中接收。
I am wondering though, why doing I need to differentiate between root and child processes? Seems like in this case, the source/root will also get a copy? Another thing is will other processes run scatter too? Probably not, but why? I thought all processes will run this code since its not in the typical if I see in MPI programs?
在某些操作如 Scatter 和 Gather 中,有必要区分通信器中的 root 和其他进程(它们不是 root 的子进程,因为它们可以在单独的计算机中),因为这些是集体通信(组通信),但只有一个来源/目的地。因此,单个源/目的地(奇数一个)称为根。所有进程都必须知道源/目标(根进程)才能正确设置发送和接收。
根进程,在 Scatter 的情况下,也会收到一段数据(来自它自己),而在 Gather 的情况下,也会将其数据包含在最终结果中。根进程也不异常(exception),除非使用“就地”操作。这也适用于所有集体沟通功能。
还有像 MPI_Allgather
这样的无根全局通信操作,其中不提供根等级。相反,所有级别都会收到正在收集的数据。
通信器中的所有进程都会运行该函数(尝试排除通信器中的一个进程,你会遇到死锁)。您可以想象不同计算机上的进程盲目地运行相同的代码。但是,由于他们每个人可能属于不同的通讯器组并且具有不同的级别,所以功能将不同地运行。每个进程都知道自己是否是通信器的成员,每个进程都知道自己的等级并可以与根进程(如果有)的等级进行比较,因此它们可以相应地建立通信或执行额外的操作。
关于c++ - 简单的 MPI_Scatter 尝试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13217149/
我想发送二维数组的列,每个列到单独的进程。我现在有一个完整的 2d 数组,但我被 MPI_Scatter 困住了。如何将整列作为字段发送? 谢谢 编辑: 我有数组 - float a[100][101
我正在尝试修改我的程序,以便代码看起来更好。现在我正在使用 MPI_Send 和 MPI_Recv,但我正在尝试使其与 MPI_Scatter 一起使用。我有一个名为 All_vals 的数组,我尝试
我正在开发一个并行排序程序来学习 MPI,但我一直在使用 MPI_Scatter 时遇到问题。每次我尝试运行时,我都会得到以下信息: reading input Scattering input _p
我知道,在处理 openMpi 时没有全局变量的概念/含义,因此当特定线程正在更改变量时,该变量的值仍将设置为其他进程中的默认值。我知道 MPI_Scatter() 的功能。 当我使用这样的东西时,
我是 MPI 世界的新手,我有点困惑.. 我使用“MPI_Scatter”将数组“分解”成多个部分。但情况是...它可以在多台机器上运行该程序吗? 我的观点是:我是否必须使用 MPI_Send 和 M
我有一个分配在连续内存空间中的动态二维数组,但是如果我尝试使用 MPI_Scatter 将该数组分散到两个 MPI 进程中,将导致段错误,整个代码粘贴在这里: dynamic_2d_array.h #
我是 MPI 的新手,我正在尝试编写使用 MPI_scatter 的程序。我有 4 个节点(0、1、2、3)。 Node0是master,其他都是slave。 Master 询问用户要发送给 slav
我正在尝试通过同一个通信器,使用非阻塞版本的通信,将两个不同的、独立的数组从等级 0 分散到所有其他数组。 沿着这些线的东西: //do some stuff with arrays here...
我想使用这种特定的内存分配方式将一个二维数组分散到其他二维数组中(每个进程一个)。 int (*matrix)[cols] = malloc(sizeof *matrix* rows); 我一直收到
我有这个串行代码,我正在尝试使用 MPI 将其转换为并行代码。但是,我似乎无法让 MPI_Scatter() 函数在不崩溃的情况下正常工作。该函数遍历名为 cells 的数组并修改一些值。 下面是原始
我正在使用 MPI 编写我的第一个程序,我很难尝试使用 MPI_Scatter 将数据正确发送到其他进程,修改它们并使用 MPI_Gather 接收值。代码如下: int** matrix; int
我正在尝试使用 MPI 库解决一个简单的程序。 进程0上存储了4*N×4*N的矩阵,矩阵每边的长度为DIM LEN = 4*N。我需要创建一个对角数据类型。但是,数据类型应该只覆盖对角线上的 N 个连
伙计们!我写了一段代码,用 MPI 计算两个巨大 vector 的标量积。首先,等级为 0 的进程创建两个随机 vector ,并通过 MPI_Scatter 将其发送给其余进程。之后,他们计算部分和
我的第一个想法是MPI_Scatter并且应该在if(proc_id == 0)子句中使用发送缓冲区分配,因为数据应该只分散一次并且每次进程只需要发送缓冲区中的一部分数据,但它无法正常工作。 看来,在
我正在学习 OpenMPI。尝试了一个简单的 MPI_Scatter 示例: #include using namespace std; int main() { int numProcs,
我的问题很简单,MPI_Scatter函数定义是: #include void MPI::Comm::Scatter(const void* sendbuf, int sendcount, cons
我正在尝试找到随机生成的数字的最大值。对此有任何想法... 我正在使用 MPI_Scatter 将随机生成的数字分成相等的进程。我正在使用 MPI_Reduce 从每个进程中获取最大值。 #inclu
我对 MPI_Scatter 有疑问。不知道如何使用它,我当前的程序在启动时因段错误而崩溃。 我猜 MPI_Scatter 的参数存在问题,尤其是在使用正确的运算符(& 或 * 或 void)调用它时
我是 mpi 编程的新手。我刚刚在 c 中使用 mpi_scatter 尝试了一个并行搜索程序。我想知道我的程序是否正确。但是当我执行一个没有 MPI_SCATTER 的程序时,即线性搜索,与并行程序
我正在尝试使用 MPI 编写矩阵 vector 乘法程序。我正在尝试将矩阵的列发送到单独的进程并在本地计算结果。最后,我使用 MPI_SUM 操作执行了 MPI_Reduce。 发送矩阵的行很容易,因
我是一名优秀的程序员,十分优秀!