Tag: mpi

包含动态分配的数组的自定义数据类型的MPI_reduce():分段错误

我不明白为什么MPI_Reduce()在我使用包含动态分配的数组的自定义MPI数据类型时会立即执行分段错误。 有人知道吗 ? 以下代码在MPI_Reduce()内部与2个处理器崩溃。 但是,如果我删除成员double * d int MyType并相应地更改运算符和MPI类型例程,则减少完成没有任何问题。 使用动态分配的数组是否存在问题,或者我的工作存在根本错误: #include #include #include typedef struct mytype_s { int c[2]; double a; double b; double *d; } MyType; void CreateMyTypeMPI(MyType *mt, MPI_Datatype *MyTypeMPI) { int block_lengths[4]; // # of elt. in each block MPI_Aint displacements[4]; // displac. MPI_Datatype typelist[4]; // list of types MPI_Aint start_address, address; […]

MPI – 工作/池示例

是否有任何使用MPI的工作/池(或。生产者/消费者)方案的例子? 至于我所做的一切,我只得到一个通过应用程序,然后我的应用程序陷入僵局。 谢谢

MPI和C结构

我不得不承认,看到用MPI传输一个C结构需要多少行代码,我感到非常震惊。 在什么情况下使用预定义的数据类型MPI_CHAR简单地传输结构? 请考虑以下示例: struct particle { double x; double y; long i; }; struct particle p; MPI_Isend(&p, sizeof(particle), MPI_CHAR, tag, MPI_COMM_WORLD, &sendr); 在我的例子中,所有进程都在相同的架构上运行。 填充是唯一的问题吗?

发送/接收的MPI数据类型是否必须匹配?

我正在尝试确定发送操作和接收操作的哪些参数必须匹配要传递的消息。 我知道接收操作必须匹配(或包含)消息的来源,标签和通信器。 但是,数据类型是否需要匹配? 我可以匹配0级的发送: MPI_Send (send_buffer, 1, MPI_INT, 1, 0, MPI_COMM_WORLD); 在1级接收操作: MPI_Recv (recv_buffer, 4, MPI_BYTE, 0, 0, MPI_COMM_WORLD, status); 特别是因为发送’计数’小于接收计数,我知道它对MPI有效。 谢谢。

来自未知来源的MPI异步广播

我有一个C项目,有n个处理器在进行一种树搜索。 在程序的任何给定时间,这些过程中的任何一个都可能找到感兴趣的东西并且想要异步地将其发送到所有其他处理器。 如何在其他进程中侦听新消息,而无需在每次循环迭代时循环遍历所有可能的发送方? 我已经阅读了有关此问题的其他问题,例如这个问题( MPI – 异步广播/收集 ),但是,到目前为止我所看到的所有问题都没有处理不可预测的发送者或循环每个可能的发送者,我实际上并不是这样。花哨。 编辑澄清: 将找到的值发送到根级别并从那里分发它是不可选的。 如果我没有那个条件,祖兰的答案会起作用,所以对于其他人来说,这可能会有所帮助。 在我的情况下,它可以(并且肯定会)发生不同的排名找到他们需要多次共享的东西(这意味着竞争条件也可能发生)。

如何使用MPI发送和接收字符串

我正在尝试使用MPI发送和接收字符串,但结果是无跳的。 发送function: MPI_Send(&result, result.size(), MPI_CHAR, 0, 0, MPI_COMM_WORLD); 和recvfunction: MPI_Recv(&result, /* message buffer */ 128, /* one data item */ MPI_CHAR, /* of type char real */ MPI_ANY_SOURCE, /* receive from any sender */ MPI_ANY_TAG, /* any type of message */ MPI_COMM_WORLD, /* default communicator */ &status); /* info about the received message */ 结果是字符串。 […]

如何使用C语言在MPI中调用相同的排名?

我正在尝试学习MPI编程并编写了以下程序。 它添加了一整行数组并输出总和。 在等级0(或过程0),它将调用其所有从属等级来进行计算。 我想只使用其他两个奴隶等级/进程来做这件事。 每当我尝试两次调用相同的等级时,如下面的代码所示,我的代码只会挂在中间而不会执行。 如果我没有两次调用相同的等级,代码将正常工作 #include “mpi.h” #include #include int main (int argc, char *argv[]) { MPI_Init(&argc, &argv); int world_rank; MPI_Comm_rank(MPI_COMM_WORLD, &world_rank); int world_size; MPI_Comm_size(MPI_COMM_WORLD, &world_size); int tag2 = 1; int arr[30] = {0}; MPI_Request request; MPI_Status status; printf (“\n–Current Rank: %d\n”, world_rank); int index; int source = 0; int dest; if (world_rank == […]

MPI Spawn:根进程不与子进程通信

(初学者问题)我正在尝试使用MPI_Comm_Spawn动态生成进程,然后向子进程广播消息,但程序在从根进程到子进程的广播中停止。 我正在关注http://www.mpi-forum.org/docs/docs.html上的文档,但我无法使其工作。 有人可以帮帮我吗? #include #include int main(int argc, char *argv[]) { MPI_Init(&argc, &argv); MPI_Comm parentcomm; MPI_Comm_get_parent( &parentcomm ); if (parentcomm == MPI_COMM_NULL) { MPI_Comm intercomm; MPI_Status status; char msg_rec[1024]; char msg_send[1024]; int size, i; int np = (argc > 0) ? atoi(argv[1]) : 3; printf(“Spawner will spawn %d processes\n”, np); MPI_Comm_spawn( argv[0], MPI_ARGV_NULL, np, MPI_INFO_NULL, […]

MPI_IN_PLACE如何与MPI_Scatter一起使用?

当作为MPI_Scatter的参数给出时MPI_IN_PLACE做了什么以及如何使用它? 我无法理解man MPI_Scatter : 当通信器是一个内部通信器时,您可以就地执行收集操作(输出缓冲区用作输入缓冲区)。 使用变量MPI_IN_PLACE作为根进程recvbuf的值。 在这种情况下,将忽略recvcount和recvtype,并且根进程不会向其自身发送任何数据。 由于就地选项将接收缓冲区转换为发送和接收缓冲区,因此包含INTENT的Fortran绑定必须将这些标记为INOUT,而不是OUT。 我想要做的是使用包含根数据的相同缓冲区作为每个其他进程的接收缓冲区(如MPI_Bcast )。 MPI_Scatter和MPI_IN_PLACE会让我这样做吗?

如何使用MPI_Gatherv从包括主节点在内的不同处理器中收集不同长度的字符串?

我试图在主节点处从所有处理器(包括主节点)收集不同长度的不同字符串到单个字符串(字符数组)。 这是MPI_Gatherv的原型: int MPI_Gatherv(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, const int *recvcounts, const int *displs, MPI_Datatype recvtype, int root, MPI_Comm comm)**. 我无法定义一些参数,如recvbuf , recvcounts和displs 。 任何人都可以在C中提供源代码示例吗?