- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
MPI_Gatherv 是 MPI 的接口(interface),如下所示:
int MPI_Gatherv(
void* sendbuf,
int sendcount,
MPI_Datatype sendtype,
void* recvbuf,
int *recvcounts,
int *displs,
MPI_Datatype recvtype,
int root,
MPI_Comm comm)
“recvcounts”的类型是“int *”,这样我们就可以分别设置每个进程要接收的元素的数量;但是我发现这是不可能实现的:
当recvcounts[i] < sendcount时,根进程将只接收sendcount项;
当recvcounts[i] > sendcount时,程序会崩溃,错误信息是这样的:
Fatal error in PMPI_Gatherv: Message truncated, error stack:
PMPI_Gatherv(386).....: MPI_Gatherv failed(sbuf=0012FD34, scount=2, MPI_CHAR, rbuf=0012FCC8, rcnts=0012FB30, displs=0012F998, MPI_CHAR, root=0, MPI_COMM_WORLD) failed
MPIR_Gatherv_impl(199):
MPIR_Gatherv(103).....:
MPIR_Localcopy(332)...: Message truncated; 2 bytes received but buffer size is 1
所以这意味着 root 必须从每个进程接收固定数量的项目并且参数 recvcount 没有意义?还是我误解了什么?
这是我的代码:
#include <mpi.h>
#include <iostream>
int main(int argc, char* argv[])
{
MPI_Init(&argc, &argv);
int n, id;
MPI_Comm_size(MPI_COMM_WORLD, &n);
MPI_Comm_rank(MPI_COMM_WORLD, &id);
char x[100], y[100];
memset(x, '0' + id, sizeof(x));
memset(y, '%', sizeof(y));
int cnts[100], offs[100] = {0};
for (int i = 0; i < n; i++)
{
cnts[i] = i + 1;
if (i > 0)
{
offs[i] = offs[i - 1] + cnts[i - 1];
}
}
MPI_Gatherv(x, 1, MPI_CHAR, y, cnts, offs, MPI_CHAR, 0, MPI_COMM_WORLD); // receive only 1 item from each process
//MPI_Gatherv(x, 2, MPI_CHAR, y, cnts, offs, MPI_CHAR, 0, MPI_COMM_WORLD); // crash
if (id == 0)
{
printf("Gatherv:\n");
for (int i = 0; i < 100; i++)
{
printf("%c ", y[i]);
}
printf("\n");
}
MPI_Finalize();
return 0;
}
最佳答案
正如@Alexander Molodih 指出的那样,sendcount=recvcount、sendtype=recvtype 将始终有效;但是当您开始创建自己的 MPI 类型时,您通常会有不同的发送和接收类型,这就是 recvcount 可能与 sendcount 不同的原因。
例如,看看最近问的 MPI partition matrix into blocks ;有一个二维数组被分解成 block 并分散。发送类型(只需要从全局数组中取出必要的数据)和接收类型(只是一个连续的数据 block )不同,计数也是不同的。
这就是发送和接收类型和计数不同的一般原因,例如 sendrecv、收集/分散或任何其他同时发生发送和接收的操作。
在您的 gatherv 情况下,每个进程可能有自己不同的发送计数,但 recvcount[] 数组必须是所有这些计数的列表,以便接收方可以正确放置接收到的数据。如果您事先不知道这些值,(每个等级只知道自己的计数,cnts[id]
)您可以先进行收集:
MPI_Gather(&(cnts[id]), 1, MPI_INT, cnts, 1, MPI_INT, 0, MPI_COMM_WORLD):
for (int i = 1; i < n; i++) {
offs[i] = offs[i - 1] + cnts[i - 1];
}
MPI_Gatherv(x, cnts[id], MPI_CHAR, y, cnts, offs, MPI_CHAR, 0, MPI_COMM_WORLD);
关于c++ - 我发现自己无法理解 MPI_Gatherv 的参数 "recvcounts",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7495714/
编辑#1: 所以解决方案是: 线 MPI_Gatherv(buffer, rank, MPI_INT, buffer, receive_counts, receive_displacements, M
我正在编写一个 MPI 程序,我需要从每个进程到根进程收集一个数组。我正在使用 MPI_Gatherv(因为数组可以具有可变长度)函数来执行此操作,但是,我不断收到 PMPI_Gatherv(455)
我编写了将 vector 乘以矩阵的代码。我用的是MPI。该矩阵分布有由行组成的 block 。 block 的大小可能并不总是相等。这些 block 工作正常,但是当我尝试运行它时,我得到半空 ve
我正在尝试为 int 数组执行 MPI_Gatherv,但不知道每个进程中每个数组的大小。有办法吗? 这是我的代码片段。 #include "mpi.h" #include using namesp
我正在尝试使用 MPI_Gatherv 收集不同大小的数组,但出于某种原因,它只收集了第一个处理器中的第一个对象。当我执行上述 for 循环时,我从 xPos 和 yPos 获得了正确的值,但是当我将
我正在尝试用 MPI_Gatherv 重新组合子数组没有深灰色行。图片值一千字: graphical overview of the ghost/halo dark-grey cells http:/
MPI_Gatherv 是 MPI 的接口(interface),如下所示: int MPI_Gatherv( void* sendbuf, int sendcount, MP
作为我的 previous 的延续问题,我修改了可变内核数的代码。但是,在我的代码中实现 Gatherv 的方式似乎并不可靠。一旦在 3-4 中运行,收集缓冲区中的结束序列最终被破坏,似乎是由于内存泄
我试图将 1-dim n*n 数组分散到 p 个处理器,然后使用 gather 取回数据。但问题是它在我运行程序时显示垃圾输出。我正在使用 n*n 的数组 A 和大小为 n 的数组 b。 // num
假设有 2 个进程参与。进程 0(等级 0)有 A = { a d b e c f } 进程1(等级1)有 A = { g h i }
我无法让 MPI_Gatherv 使用 std::vector。我写了一个小程序,应该用 rank+1 的整数填充一个 vector (以避免 0,因为 vector 被初始化为 0)。这只是一个使用
我是编程新手,尤其是 MPI。我正在尝试将多个数组从根处理器分散到其他处理器,对这些数组执行一些操作然后收集数据,但它会将所有数据分散到所有处理器并且输出邻接矩阵不正确所以我假设这是因为我错误地使用了
我正在尝试在 C 中实现 MPI_Gatherv 函数。 根据我的程序,包括 root 在内的每个进程都应该创建一个大小等于 (process' rank + 1) 的本地数组,它将在所有单元格中保存
我是 MPI 的新手,我正在尝试并行管理不同大小的数组,然后将它们传递给主线程,但到目前为止没有成功。 我知道了 MPI_Gatherv(const void *sendbuf, int sendco
我认为描述问题的最简单方法是使用简单的代码。在每个处理器上,我都动态分配了“2D 数组”(通过 new*[rows]、new[cols] 形式实现,请参阅下面的代码进行说明)。无论对错,我都在尝试使用
我是一名优秀的程序员,十分优秀!