- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我想以最简单的方式将 NXN 矩阵的反对角元素从根进程发送到另一个进程。遗憾的是,目前我无法测试我的代码,因为计算节点已关闭。有人可以检查我的简单代码吗?
我不确定我是否正确发送了 A 的反诊断元素。反对角线元素会落在接收缓冲区 B 中吗?
#include "mpi.h"
#include <stdio.h>
int main(int argc, char** argv){
MPI_Init(&argc,&argv);
int size, rank;
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
MPI_Comm_size(MPI_COMM_WORLD,&size);
int N=4;
double A[N][N];
double B[N];
MPI_Datatype antidiag;
int* blockleng=(int*)malloc(N*sizeof(int));
int* displace=(int*)malloc(N*sizeof(int));
for(int i=0; i<N; ++i){
blockleng[i]=1;
displace[i] = (i+1)*(N-1);
}
MPI_Type_indexed(N,blockleng,displace, MPI_DOUBLE,antidiag);
MPI_Type_commit(&antidiag);
MPI_Status status;
if(rank==0){
A= {
{1.0,5.0,9.0,13.0},
{2.0,6.0,10.5,14.5},
{3.0,7.2,11.0,15.0},
{4.0,8.0,12.0,16.0}
};
MPI_Send(A,1,antidiag,1,100,MPI_COMM_WORLD);
}
if(rank==1){
MPI_Recv(B,1,antidiag,0,100,MPI_COMM_WORLD,status);
}
MPI_Type_free(&antidiag);
MPI_Finalize();
return 0;
}
最佳答案
您的程序中有几个问题。我不会发布整个程序,而是专注于这些问题。
循环内的变量声明从 C99 开始有效。如果您需要使用旧标准,这就是循环的样子,
int i, j;
for(i=0; i<N; ++i){
blockleng[i]=1;
displace[i] = (i+1)*(N-1);
}
使用 MPI_Type_indexed
创建 MPI 数据类型时你的最后一个参数,新类型,必须作为指针/句柄传递:
MPI_Type_indexed(N, blockleng, displace, MPI_DOUBLE, &antidiag);
将值分配给矩阵 A 的方式只能作为初始化与声明相结合的一部分,更多 here .当然,你可以分别为 0 级和其他等级这样做,但你也可以只从 0 级的文件中读取矩阵数据,
char* file_in = "matrix_A.txt";
FILE *fpi;
fpi=fopen(file_in, "r");
for (i=0; i<N; i++)
for (j=0; j<N; j++)
if (!fscanf(fpi, "%lf", &A[i][j]))
break;
作为 if(rank==0){
block 的一部分。您还可以将矩阵文件名作为命令行参数,这将为您提供更大的灵 active 。在这一点上,您还希望将 N
作为命令行参数,以便能够定义您正在阅读的矩阵的大小。本例中使用的文件结构简单,
1.0 5.0 9.0 13.0
2.0 6.0 10.5 14.5
3.0 7.2 11.0 15.0
4.0 8.0 12.0 16.0
同一 block 中的发送部分仅发送到单个等级,等级 1。如果我正确理解你的问题,你想将反对角线发送到等级 0 的所有其他等级,这需要以下循环,
for (i=1; i<size; i++)
MPI_Send(A, 1, antidiag, i, 100, MPI_COMM_WORLD);
类似地,接收部分应该适用于除 0 以外的所有等级,
else{
MPI_Recv(B, N, MPI_DOUBLE, 0, 100, MPI_COMM_WORLD, &status);
}
请注意,这里还有其他更正 - 您在 N 大小的缓冲区/数组 B 中接收数据,而不是 NxN 矩阵 A。atidiag
是为矩阵 A(或N*N 元素 1D 缓冲区,在这种情况下是等效的)- 它不适用于 N 元素缓冲区 B。因此,您需要更改 MPI_Recv
以期望/检索 MPI_DOUBLE 类型的 N 个元素。这是一项巧妙的功能,因为它允许您将数据接收到与发送数据结构不同的数组中。您还需要传递一个指向 status
的指针,因此是 &status
。
最后,您可以打印结果,
if (rank != 0){
printf("Rank %d:\n", rank);
for (i=0; i<N; i++)
printf("%.2lf ", B[i]);
}
printf("\n\n");
请记住,打印到 stout
的 MPI 不是根据等级编号排序的,而且在打印过程中等级可能会相互中断。刷新 stdout
可能会有所帮助,但更好的选择是写入文件。在这种情况下,在我的系统上,输出是按应有的方式打印的。测试最多 6 个进程。
最后一点 - 通常在 1 个进程向所有其他进程发送消息的情况下,您应该考虑使用集体通信功能,例如 MPI_Bcast
。这些函数经过高度优化,并且在它们专门处理的情况下优于 Send\Recv。现在,使用 Bcast
,您需要实际将接收到的对角线存储在所有等级的 A 矩阵中,然后将其复制到数组/缓冲区 B 在 0 以外的等级上。这会增加几个步骤,所以我将它保留在你的帖子中。
关于c - 使用 MPI 发送和接收派生数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51823579/
我有一个无法理解的奇怪编译问题。 //I know, you should never derive from the STL Library template class SharedClass :
我是一个刚开始学习 Haskell 的菜鸟,所以如果我问愚蠢的问题,请耐心等待。 最近我在 SO 中遇到了演示如何导出函数和表达式的类型和实现的问题(诸如 How can I understand "
如何自动派生此 GADT 的 Read 实例: {-# LANGUAGE GADTs, StandaloneDeriving #-} data TypeDec a where TypeDecInt
我遇到了我想要的情况 Deal class要注意它DealDetail type反之亦然,我想 DealDetail注意Deal type .将来我想有很多 Deal 的后代和 DealDetails
我是 C# 新手,所以请多多包涵。 好的,所以我在不同的程序集中有两个类需要相互引用: namespace AssemblyA { class A { private B MyB {
简而言之,我已经实现了一个派生自 SynchronizationContext 的类,以便 GUI 应用程序可以轻松地使用在 GUI 线程以外的线程上引发的事件。我非常感谢对我的实现的评论。具体来说,
我正在设计一个小型系统,想知道如何为派生类分配内存的细微差别。 如果我有两个类(class) class foo { public: int a; Foo(): a(0) {}; }; class
我正在尝试编写一个派生 PartialEq 的枚举,其中包含一个手动执行此操作的特征对象。我使用了解决方案 here为了强制 Trait 的实现者编写相等方法。这无法编译: trait Trait {
以下代码可以编译(特别是 MyError 被识别为具有调试特性): use std::str; use std::fmt; #[derive(Debug)] enum MyError where F:
是否有一种简单的方法来注释结构中的字段,以便在派生 PartialEq 特征时忽略它们?例如: #[derive(PartialEq,Eq)] pub struct UndirectedGraph {
我正在编写代码来处理“Foo”类型的对象。 foo 是一种容器,为了提供对其元素的高效和抽象访问,它提供了 Element 类型的嵌套类。 Element 包装对象在容器中的位置。 现在,“Foo”可
假设如下: class child : public parent { public: fun1(parent * obj); //somewhere on the child class
我有几个模板类 template class Transition { public: virtual Cost getCost() = 0; }; template class St
我正在尝试使用自定义 QSortFilterProxyModel . 这是我的标题: #include class QSortFilterProxyModel_NumbersLast : publi
我正在使用 C# 和 mvc3。我在解决方案中添加了一个项目。我想创建一个新 Controller 并让它从我添加的项目中的 Controller 派生。我该怎么做? 最佳答案 在 Visual St
我在 python 中有一个对象,它派生自 QtGui.QGraphicsPixmapItem,具有一些基本属性和方法。在对此对象的引用上调用 deepcopy 后,当我尝试使用该副本时收到一条错误消
由于只能给FixedDocument添加页面,所以我写了一个派生类: public class CustomFixedDocument : FixedDocument { public voi
我在自定义 QMainWindow 时遇到了很大的问题,因为我不知道如何实现以下内容: 在 QMainWindow 文档中,QMainWindow 有一些用于工具栏、停靠小部件、状态栏和其他的特殊区域
我想感受一下QT,决定写一个小的十六进制编辑器。为此,我需要一个允许滚动的小部件。经过一番研究,我发现 QTextEdit 为此目的派生自 QAbstractScrollArea。在阅读 QAbstr
我正在寻找一种可以从已经发生的洗牌过程中派生出 key 的算法。 假设我们有被打乱的字符串“Hello”: "hello" -> "loelh" 现在我想从中导出一个 key k,我可以用它来撤销洗牌
我是一名优秀的程序员,十分优秀!