- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
对于MPI中的异步通信,以下哪个更好(在性能、可靠性、可读性等方面):
通信场景是必须异步交换数据,到达时间无关紧要,两个进程都有工作量。仅考虑整体性能(尤其是无阻塞)。
下面是一个最小的工作示例(我没有包括工作量,因此时间安排可能没有意义)。
#include <mpi.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char const *argv[]) {
MPI_Init(NULL, NULL);
int world_size, world_rank;
MPI_Comm_size(MPI_COMM_WORLD, &world_size);
MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
if (world_rank == 0 && world_size != 2) {
fprintf(stderr, "This example requires two MPI processes.\n");
MPI_Abort(MPI_COMM_WORLD, EXIT_FAILURE);
}
/* Non Blocking Send */
int buf[100] = {0};
MPI_Barrier(MPI_COMM_WORLD);
double time = MPI_Wtime();
if (world_rank == 1) {
MPI_Request request;
MPI_Isend(buf, 100, MPI_INT, 0, 0, MPI_COMM_WORLD, &request);
MPI_Wait(&request, MPI_STATUS_IGNORE);
} else {
MPI_Recv(buf, 100, MPI_INT, 1, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
}
time = MPI_Wtime() - time;
printf("rank = %d, time = %f sec\n", world_rank, time);
MPI_Barrier(MPI_COMM_WORLD);
usleep(100);
if (world_rank == 0) {
printf("---\n");
}
/* Non Blocking Receive */
MPI_Barrier(MPI_COMM_WORLD);
time = MPI_Wtime();
if (world_rank == 1) {
MPI_Send(buf, 100, MPI_INT, 0, 0, MPI_COMM_WORLD);
} else {
MPI_Request request;
MPI_Irecv(buf, 100, MPI_INT, 1, 0, MPI_COMM_WORLD, &request);
MPI_Wait(&request, MPI_STATUS_IGNORE);
}
time = MPI_Wtime() - time;
printf("rank = %d, time = %f sec\n", world_rank, time);
MPI_Barrier(MPI_COMM_WORLD);
MPI_Finalize();
return 0;
}
在我的机器上生成:
rank = 0, time = 0.000035 sec
rank = 1, time = 0.000036 sec
---
rank = 0, time = 0.000035 sec
rank = 1, time = 0.000026 sec
谢谢你的回答,祝你有愉快的一天:)
最佳答案
一般的经验法则是:
反过来做也不错,但是,您可以更好地重叠发送和接收。
因此,应该选择您描述的第二种情况。此外,如果您不使用非阻塞通信,请注意死锁。有关死锁,请参阅 MPI Send and receive questions .
读者练习:
在下面的片段中,假设所有缓冲区都分配了足够的大小。此外,等级和大小分别表示每个进程的等级和 MPI 进程的总数。对于每个片段,请注意它是否死锁并解释原因。报告性能问题。
片段 1:
int ireq = 0;
for (int p=0; p<size; p++)
if (p!=rank)
MPI_Isend(sbuffers[p],buflen,MPI_INT,p,0,comm,&(reqs[ireq++]));
for (int p=0; p<size; p++)
if (p!=rank)
MPI_Recv(rbuffer,buflen,MPI_INT,p,0,comm,MPI_STATUS_IGNORE);
MPI_Waitall(size-1,reqs,MPI_STATUSES_IGNORE);
片段 2:
int ireq = 0;
for (int p=0; p<size; p++)
if (p!=rank)
MPI_Irecv(rbuffers[p],buflen,MPI_INT,p,0,comm,&(reqs[ireq++]));
MPI_Waitall(size-1,reqs,MPI_STATUSES_IGNORE);
for (int p=0; p<size; p++)
if (p!=rank)
MPI_Send(sbuffer,buflen,MPI_INT,p,0,comm);
解决方法:
片段 1 存在性能问题,反转 recv 和发送。
片段 2 由于 Waitall 而出现死锁。
关于MPI_Isend/MPI_Recv 与 MPI_Send/MPI_Irecv,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53204330/
我的代码可以在我的github上找到: https://github.com/chrismunley/ParallelProgramming/tree/master 我得到的错误是:PGC-W-009
我有这段代码用于测试 MPI_Irecv 和 MPI_Isend if(rank==1){ int cc; MPI_Request request;
我一直在并行执行哲学家就餐问题,但遇到了一个我无法解决的问题。基本上,我有一个 for 循环,其中一个进程检查是否有任何新消息,然后休眠半秒钟(它重复随机次数)。在该部分之后,它会尝试收集所有需要的
来自 OpenMPI 文档:C++ 语法 Request Comm::Irecv(void* buf, int count, const Datatype& datatype, int sou
我试图在这个简化的代码中实现的是: 2 种类型的进程(根进程和子进程,ids/rank 分别为 10 和 0-9) 初始化: root 会听 child “完成” children 将在所有完成后收听
MPI_IRecv(&myArr[0], 5, MPI_INT, 1, MPI_ANY_TAG, MPI_COMM_WORLD, request); MPI_IRecv(&myArr[5], 5, M
我想知道为什么我无法通过 MPI_Recv 命令访问数据。我有一个包含 100 个元素的数组,我想将其分为 8 个进程。由于 100/8 返回不等长度的 block ,因此我手动执行此操作。然后我计算
对于MPI中的异步通信,以下哪个更好(在性能、可靠性、可读性等方面): MPI_Isend with buffer 然后 MPI_Iprobe & MPI_Recv 一旦接收器准备好,或者 带缓冲区的
我有一个一维矩阵数据作为 Q_send_matrix。在每次迭代中,每个处理器更新其Q_send_matrix并将其发送到前一个处理器(rank-1),同时它接收一个新更新的矩阵作为Q_recv_ma
我正在编写一个程序来检测远程机器的突然崩溃。 manager 进程在机器 1 上运行,worker 进程在机器 2 上运行。 manager 服务器通过调用 MPI_Isend 向工作进程发送消息。
我想了解 MPI 如何处理发送和接收。假设我分配一个 [12][50] 元素的缓冲区,如下所示: int **buf= malloc(12 * sizeof(int *)); for (i = 0;
我对两个 MPI_Irecv 使用了 2 个 MPI_Irecv,然后是 2 个 MPI_Send,然后是 MPI_Waitall,如下所示。经过几次计算后,我再次编写了相同的代码块。但 MPI 进程
MPI_Isend 和 MPI_Irecv 有问题。我正在研究按行分布的图的邻接矩阵。我们可以假设每个处理器包含一行。对于每对索引 (i,j) 我需要发送和接收 2 个整数。基本上,我需要从其他行接收
我在使用 C 语言的 MPI 程序时遇到了一些问题。我想使用 MPI_Send 从从站向主站发送两条消息(使用 MPI_Send、MPI_Irecv 和 MPI_Test),但只有第一条消息有效。在那
当我尝试在四个处理器上运行一个问题时收到以下错误序列。我使用的 MPI 命令是 mpirun -np 4 我很抱歉按原样发布错误消息(主要是由于缺乏破译给定信息的知识)。感谢您在以下方面的意见: 错误
我有一个项目,我需要使用 MPI_Isend 和 MPI_Irecv 对 MPI_Bcast 的任何错误实现进行计时,并将其与 MPI_Bcast 进行比较。因为这些程序的时间是 0.000000 秒
我正在学习 c 中的 mpi 通信。我在尝试使用 MPI_Isend 从一个节点发送消息并使用 MPI_Irecv 在另一个节点上接收它时遇到问题。这是代码: #include #include
我想运行一个程序来了解 MPI_Isend 和 MPI_Irecv 的工作原理。等级 0 的 Isend 和 Irecv 工作正常,但等级 5 的 Irecv 采用默认值。有人可以向我解释一下吗? #
我是一名优秀的程序员,十分优秀!