- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我是编程新手,尤其是 MPI。我正在尝试将多个数组从根处理器分散到其他处理器,对这些数组执行一些操作然后收集数据,但它会将所有数据分散到所有处理器并且输出邻接矩阵不正确所以我假设这是因为我错误地使用了 scatterv 和/或 gatherv。我不确定我是否应该逐个元素地散布矩阵,或者是否有办法散布整个矩阵。如果您可以查看我的代码,我们将不胜感激。谢谢!
int rank, size;
MPI_Status status;
MPI_Datatype strip;
bool passflag[Nmats];
MPI::Init();
rank = MPI::COMM_WORLD.Get_rank();
size = MPI::COMM_WORLD.Get_size();
int sendcounts[size], recvcounts, displs[size], rcounts[size];
if(rank == root){
fin.open(infname);
fout.open(outfname);
/* INPUT ADJ-MATS */
for(i = 0; i < Nmats; i++){
fin >> dummy;
for (j = 0; j < N; j++){
for (k = 0; k < N; k++) {
fin >> a[i][j][k];
}
}
}
}
/* Nmats = Number of matrices; N = nodes; Nmats isn't divisible by the number of processors */
Nmin= Nmats/size;
Nextra = Nmats%size;
k=0;
for(i=0; i<size; i++){
if( i < Nextra) sendcounts[i] = Nmin + 1;
else sendcounts[i] = Nmin;
displs[i] = k;
k = k + sendcounts[i];
}
recvcounts = sendcounts[rank];
MPI_Type_vector(Nmin, N, N, MPI_FLOAT, &strip);
MPI_Type_commit(&strip);
MPI_Scatterv(a, sendcounts, displs, strip, a, N*N, strip, 0, MPI_COMM_WORLD);
/* Perform operations on adj-mats */
for(i=0; i<size; i++){
if(i<Nextra) rcounts[i] = Nmin + 1;
else rcounts[i] = Nextra;
displs[i] = k;
k = k + rcounts[i];
}
MPI_Gatherv(&passflag, 1, MPI::BOOL, &passflag, rcounts , displs, MPI::BOOL, 0, MPI_COMM_WORLD);
MPI::Finalize();
//OUTPUT ADJ_MATS
for(i = 0; i < Nmats; i++) if (passflag[i]) {
for(j=0;j<N; j++){
for(k=0; k<N; k++){
fout << a[i][j][k] << " ";
}
fout << endl;
}
fout << endl;
}
fout << endl;
您好,我能够让代码为静态分配工作,但是当我尝试动态分配它时,代码或多或少地“崩溃”了。我不确定我是否需要在 MPI 之外分配内存,或者这是否是我在初始化 MPI 后应该做的事情。任何建议将不胜感激!
//int a[Nmats][N][N];
/* Prior to adding this part of the code it ran fine, now it's no longer working */
int *** a = new int**[Nmats];
for(i = 0; i < Nmats; ++i){
a[i] = new int*[N];
for(j = 0; j < N; ++j){
a[i][j] = new int[N];
for(k = 0; k < N; k++){
a[i][j][k] = 0;
}
}
}
int rank, size;
MPI_Status status;
MPI_Datatype plane;
bool passflag[Nmats];
MPI::Init();
rank = MPI::COMM_WORLD.Get_rank();
size = MPI::COMM_WORLD.Get_size();
MPI_Type_contiguous(N*N, MPI_INT, &plane);
MPI_Type_commit(&plane);
int counts[size], recvcounts, displs[size+1];
if(rank == root){
fin.open(infname);
fout.open(outfname);
/* INPUT ADJ-MATS */
for(i = 0; i < Nmats; i++){
fin >> dummy;
for (j = 0; j < N; j++){
for (k = 0; k < N; k++) {
fin >> a[i][j][k];
}
}
}
}
Nmin= Nmats/size;
Nextra = Nmats%size;
k=0;
for(i=0; i<size; i++){
if( i < Nextra) counts[i] = Nmin + 1;
else counts[i] = Nmin;
displs[i] = k;
k = k + counts[i];
}
recvcounts = counts[rank];
displs[size] = Nmats;
MPI_Scatterv(&a[displs[rank]][0][0], counts, displs, plane, &a[displs[rank]][0][0], recvcounts, plane, 0, MPI_COMM_WORLD);
/* Perform operations on matrices */
MPI_Gatherv(&passflag[displs[rank]], counts, MPI::BOOL, &passflag[displs[rank]], &counts[rank], displs, MPI::BOOL, 0, MPI_COMM_WORLD);
MPI_Type_free(&plane);
MPI::Finalize();
最佳答案
看起来您在 a
中拥有的实际上是 Nmat
平面,每个平面包含 N
x N
元素。在嵌套循环中填充其元素时索引 a
的方式表明这些矩阵在内存中是连续布局的。因此,您应该将 a
视为一个 Nmat
元素数组,每个元素都是一个 N*N
复合元素。您只需注册一个跨越单个矩阵内存的连续类型:
MPI_Type_contiguous(N*N, MPI_FLOAT, &plane);
MPI_Type_commit(&plane);
在不使用额外数组的情况下分散数据是使用分散操作的就地模式完成的:
// Perform an in-place scatter
if (rank == 0)
MPI_Scatterv(a, sendcounts, displs, plane,
MPI_IN_PLACE, 0, plane, 0, MPI_COMM_WORLD);
// ^^^^^^^^ ignored because of MPI_IN_PLACE
else
MPI_Scatterv(a, sendcounts, displs, plane,
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ignored by non-root ranks
a, sendcounts[rank], plane, 0, MPI_COMM_WORLD);
// ^^^^^^^^^^^^^^^^ !!!
请注意,每个等级必须通过提供来自 sendcounts[]
的相应元素(在您的代码中固定为 N*N
).
在收集操作中也应该使用就地模式:
if (rank == 0)
MPI_Gatherv(MPI_IN_PLACE, 0, MPI_BOOL,
// ^^^^^^^^^^^^ ignored because of MPI_IN_PLACE
passflag, rcounts, displs, MPI_BOOL, 0, MPI_COMM_WORLD);
else
MPI_Gatherv(passflag, rcounts[rank], displs, MPI_BOOL,
// ^^^^^^^^^^^^^ !!!
passflag, rcounts, displs, MPI_BOOL, 0, MPI_COMM_WORLD);
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ignored by non-root ranks
请注意,rcounts
和 sendcounts
具有基本相同的值,您不必计算它们两次。只需调用数组 counts
并在 MPI_Scatterv
和 MPI_Gatherv
调用中使用它。这同样适用于 displs
的值 - 不要计算它们两次,因为它们是相同的。在第二次计算之前,您似乎也没有将 k
设置为零(尽管这可能不会在此处发布的代码中显示)。
关于c++ - 用于多个 3d 阵列的 MPI_Scatterv 和 MPI_Gatherv,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24633337/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!