- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个一维矩阵数据作为 Q_send_matrix
。在每次迭代中,每个处理器更新其Q_send_matrix
并将其发送到前一个处理器(rank-1
),同时它接收一个新更新的矩阵作为Q_recv_matrix
来自下一个处理器(rank+1
)。例如,在一次迭代中,Proc[0]
更新它的 Q_send_matrix
并将其发送到 Proc[3]
,而它接收 来自
。正如您所估计的那样,它就像一个环形通信。请在我在下面对代码进行解释后查看下面的代码。Proc[1]
的 Q_recv_matrix
MPI_Request request;
MPI_Status status;
// All the elements of Q_send and Q_recv buffers
// are set to 1.0 initially. Each processor
// updates its Q_send buffer to prepare it
// to be sent below.(above part is big, so it
// is not added here...)
/**
* Transfer Q matrix blocks among processors
* + Each processor sends the Q matrix
* + to the previous processor while receives
* + the Q matrix from the next processor
* + It is like a ring communication
* */
/* Receive Q matrix with MPI_Irecv */
source = (my_rank+1)%comm_size;
recv_count = no_col_per_proc[source]*input_k;
MPI_Irecv(Q_recv_matrix, recv_count,
MPI_FP_TYPE, source,
0, MPI_COMM_WORLD,
&request);
/* Send Q matrix */
dest = (my_rank-1+comm_size)%comm_size;
send_count = no_col_per_proc[my_rank]*input_k;
MPI_Send(Q_send_matrix, send_count,
MPI_FP_TYPE, dest,
0, MPI_COMM_WORLD);
/* Wait status */
// MPI_Wait(request, status);
/* Barrier */
MPI_Barrier(MPI_COMM_WORLD);
/* Print Q send and receive matrices */
for( j = 0; j < send_count; j ++ )
{
printf("P[%d] sends Q_send[%d] to P[%d] = %.2f\n",
my_rank, j, dest, Q_send_matrix[j]);
}
for( j = 0; j < recv_count; j ++ )
{
printf("P[%d] receives Q_recv[%d] from P[%d] = %.2f\n",
my_rank, j, source, Q_recv_matrix[j]);
}
我想以同步方式进行此通信。但是,MPI_Send
和 MPI_Recv
是不可能的,因为它们的阻塞特性会导致死锁。因此,我将 MPI_Irecv
和 MPI_Send
与 MPI_Wait
一起使用。然而,它并没有完成,所有的处理器都在等待。所以,我用 MPI_Barrier
代替 MPI_Wait
让它们同步,解决了处理器的等待问题,所以它们完成了工作。但是,它无法正常工作。以下代码的某些输出是错误的。每个处理器发送正确的数据,发送端没有问题。另一方面,接收数据缓冲区没有变化。这意味着在某些处理器中,即使从其他处理器之一接收到数据,接收缓冲区的初始值仍然存在,如下所示。
P[0] sends Q_send[0] to P[3] = -2.12
P[0] sends Q_send[1] to P[3] = -2.12
P[0] sends Q_send[2] to P[3] = 4.12
P[0] sends Q_send[3] to P[3] = 4.12
P[0] receives Q_recv[0] from P[1] = 1.00
P[0] receives Q_recv[1] from P[1] = 1.00
P[0] receives Q_recv[2] from P[1] = 1.00
P[0] receives Q_recv[3] from P[1] = 1.00
P[1] sends Q_send[0] to P[0] = -2.12
P[1] sends Q_send[1] to P[0] = -2.12
P[1] sends Q_send[2] to P[0] = 0.38
P[1] sends Q_send[3] to P[0] = 0.38
P[1] receives Q_recv[0] from P[2] = 1.00
P[1] receives Q_recv[1] from P[2] = 1.00
P[1] receives Q_recv[2] from P[2] = 1.00
P[1] receives Q_recv[3] from P[2] = 1.00
P[2] sends Q_send[0] to P[1] = 1.00
P[2] sends Q_send[1] to P[1] = 1.00
P[2] sends Q_send[2] to P[1] = -24.03
P[2] sends Q_send[3] to P[1] = -24.03
P[2] receives Q_recv[0] from P[3] = 1.00
P[2] receives Q_recv[1] from P[3] = 1.00
P[2] receives Q_recv[2] from P[3] = 1.00
P[2] receives Q_recv[3] from P[3] = 1.00
P[3] sends Q_send[0] to P[2] = 7.95
P[3] sends Q_send[1] to P[2] = 7.95
P[3] sends Q_send[2] to P[2] = 0.38
P[3] sends Q_send[3] to P[2] = 0.38
P[3] receives Q_recv[0] from P[0] = -2.12
P[3] receives Q_recv[1] from P[0] = -2.12
P[3] receives Q_recv[2] from P[0] = 4.12
P[3] receives Q_recv[3] from P[0] = 4.12
最佳答案
在从 MPI_Irecv
访问数据之前,您必须完成一个MPI_Wait
或一个成功的MPI_Test
。你不能用障碍代替它。
对于环形通信,考虑使用 MPI_Sendrecv
。它可以比使用异步通信更简单。
关于c - MPI_Irecv 没有正确接收 MPI_Send 发送的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42121393/
我有一个使用 openmpi 编译和运行的代码。最近,我想使用 Intel MPI 运行同样的代码。但是我的代码没有按预期工作。我深入研究了代码,发现 MPI_Send 在两个实现中的行为不同。 我从
我想将 MPI_Send 消息发送到单个但可变的主机。我的意思是,我在编译时不知道要发送消息的主机的级别。 很自然地,我写的内容如下: MPI_Send(&myIntData, 1, MPI_INT,
我可以在单个 MPI_SEND 中发送一个矩阵的行和另一个矩阵的列,我该如何执行此过程? MPI_SEND (row and column of the matrix ...) 最佳答案 由于 C/C
我有以下代码: double * myX; double * myY; double * myZ; int amount; int count; // number of process v
我正在编写 mpi 的 C++ 包装器。 我在 mpi 遇到了一个奇怪的错误:在我的例子中,错误只在消息足够大时出现,运行时错误如下: Fatal error in MPI_Send: Other M
如果我想定义自己的类型,并将其用作 MPI_Send 的数据类型以仅从矩阵中获取偶数行,是否必须静态分配该矩阵(发送缓冲区)? 我动态分配的时候好像有问题。这是因为地址需要连续才能发送数据吗? 最佳答
我正在使用 MPI 编写 Mergesort 来对整数数组进行排序。这个想法是在同一等级上对数组的左半部分进行归并排序,同时将数组的右半部分发送到子等级。所以如果有四个过程,它看起来像这样:
我必须在我的程序中使用 MPI API 发送/接收矩阵。为了发送矩阵,我使用了以下语法: MPI_Send(matrix, ...) <- USE THIS MPI_Send(&matrix, ..
在大量内核上调试我的程序时,我遇到了非常奇怪的虚拟内存不足错误。我的调查导致代码和平,主人向每个奴隶发送小消息。然后我写了一个小程序,其中 1 个主机使用 MPI_SEND 发送 10 个整数,所有从
这是我在 stackoverflow 中的第一个问题。我有两个进程,一个根 0 和一个从属 1。从属分配一个二维数组 (CHUNK_ROWS+2,CHUNK_COLUMNS+2) 并想发送一个 [CH
我正在尝试使用 MPI 形成环形通信,其中我的每个进程都将其结果发送到下一个进程,最后一个进程将结果发送到第 0 个进程。假设我有 4 个进程,那么我的第 0 个进程会将结果发送到第 1 个、第 1
我得到了一个小练习,我必须通过使用 MPI 来估计 n 个球体的总体积来实现蒙特卡罗算法,这些球体的中心坐标和半径在 3 维中。即使我们必须使用 MPI,我们也可以在本地机器上启动所有进程,因此没有网
当我使用超过 1 个处理器执行程序时,程序将停止工作。它在第一个 MPI_Send 处停止我做错了什么? #include "mpi.h" #include #include #include
我有一个主进程和更多从进程。我希望每个从进程向主进程发送一个整数,所以我想我应该使用 MPI_Gather 收集它们。但不知怎的,它不起作用,我开始认为 MPI_Gather 与 MPI_Send 不
我正在尝试将多列“B”矩阵从处理器 0 发送到不同的处理器。我正在尝试使用 MPI_Send 进行发送,但它不起作用。有人可以帮助我吗? 例如:方阵 B 的大小为 7。这样就应该被分发了。 处理器 0
最近才知道MPI_Send不能一次发送太长的数据,所以决定把数据分成几 block ,用for循环发送。下面是一个测试用例。这里的问题是,如果我使用少量数据并将其分成几 block ,程序将运行;但是
我正在尝试使用 MPI 在 C++ 中处理一些动态分配的多维数组。为了避免担心不连续的内存,我编写了一个类包装器,它允许我像访问二维数组一样访问一维数组。我正在尝试创建一个 MPI 数据类型以通过 M
这可能是一件微不足道的事情,但是: 底层数组的大小是否可以长于在 MPI_Send( ... ) 调用中与缓冲区指针一起发送的计数参数? 至于 MPI_Recv( ... ),我发现消息来源清楚地表明
我正在尝试运行下面使用并行编程的程序。如果我们使用 4 个处理器,我希望它们包含总和 1+2=3、3+4=7、11 和 15。所以我希望求和 vector 按顺序包含 3、7、11 和 15。但是,由
我正在学习 MPI_Send,但我对这种方法感到困惑。我写了一个简单的乒乓程序,rank-0 节点发送消息给 rank-1 节点,然后后者返回消息给前一个。 if (rank == 0) { /*
我是一名优秀的程序员,十分优秀!