- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我是 MPI 的新手,用 C 语言编写了以下程序。我不想使用指针,而是想如下所示设置我的数组。我的第一个数组元素读取正确,之后,它不会读取数组元素。你能告诉我这是否不是使用分散和收集的正确方法吗
以下是我得到的结果:
$ mpicc test.c -o test
$ mpirun -np 4 test
1. Processor 0 has data 0 1 2 3
2. Processor 0 has data 0
3. Processor 0 doubling the data, now has 5
2. Processor 1 has data 32767
3. Processor 1 doubling the data, now has 5
2. Processor 2 has data -437713961
3. Processor 2 doubling the data, now has 5
2. Processor 3 has data 60
3. Processor 3 doubling the data, now has 5
4. Processor 0 has data: 5 1 2 3
正确的结果应该是:
$ mpicc test.c -o test
$ mpirun -np 4 test
1. Processor 0 has data 0 1 2 3
2. Processor 0 has data 0
3. Processor 0 doubling the data, now has 5
2. Processor 1 has data 1
3. Processor 1 doubling the data, now has 5
2. Processor 2 has data 2
3. Processor 2 doubling the data, now has 5
2. Processor 3 has data 3
3. Processor 3 doubling the data, now has 5
4. Processor 0 has data: 5 5 5 5
如有任何帮助,我们将不胜感激。以下代码使用 4 个处理器运行:
#include <mpi.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv) {
int size, rank;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
int globaldata[4]; /*wants to declare array this way*/
int localdata[4]; /*without using pointers*/
int i;
if (rank == 0) {
for (i = 0; i < size; i++)
globaldata[i] = i;
printf("1. Processor %d has data: ", rank);
for (i = 0; i < size; i++)
printf("%d ", globaldata[i]);
printf("\n");
}
MPI_Scatter(globaldata, 1, MPI_INT, &localdata, 1, MPI_INT, 0, MPI_COMM_WORLD);
printf("2. Processor %d has data %d\n", rank, localdata[rank]);
localdata[rank]= 5;
printf("3. Processor %d now has %d\n", rank, localdata[rank]);
MPI_Gather(&localdata, 1, MPI_INT, globaldata, 1, MPI_INT, 0, MPI_COMM_WORLD);
if (rank == 0) {
printf("4. Processor %d has data: ", rank);
for (i = 0; i < size; i++)
printf("%d ", globaldata[i]);
printf("\n");
}
MPI_Finalize();
return 0;
}
最佳答案
原则上,您的设置和散点图没问题。您的问题出在打印上,因为您在这里误解了分散/聚集的细节。
分散 4 元素数组时,每个进程仅获取一个元素(如您使用 MPI_Scatter call()
的第二个和第五个参数定义的那样)。此元素存储在本地数组的 0 索引中。它实际上是一个标量。
一般来说,你可能会分散非常大的数组,每个进程可能仍然需要处理一个大的本地数组。在这些情况下,必须正确计算全局指数和本地指数。
假设以下玩具问题:您想将数组 [1 2 3 4 5 6] 分散到两个进程中。 Proc0 应该有 [1 2 3] 部分,Proc1 应该有 [4 5 6] 部分。在这种情况下,全局数组的大小为 6,局部数组的大小为 3。Proc0 获取全局元素 0、1、2 并将它们分配给其局部 0、1、2。Proc1 获取全局元素 3、4 , 5 并将它们分配给它的本地 0, 1, 2.
当您了解 MPI_Scatterv 时,您可能会更好地理解这个概念。它不会为每个进程假定相同数量的本地元素。
这个版本的代码似乎可以工作:
#include <mpi.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv) {
int size, rank;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
int globaldata[4];/*wants to declare array this way*/
int localdata;/*without using pointers*/
int i;
if (rank == 0) {
for (i=0; i<size; i++)
globaldata[i] = i;
printf("1. Processor %d has data: ", rank);
for (i=0; i<size; i++)
printf("%d ", globaldata[i]);
printf("\n");
}
MPI_Scatter(globaldata, 1, MPI_INT, &localdata, 1, MPI_INT, 0, MPI_COMM_WORLD);
printf("2. Processor %d has data %d\n", rank, localdata);
localdata= 5;
printf("3. Processor %d now has %d\n", rank, localdata);
MPI_Gather(&localdata, 1, MPI_INT, globaldata, 1, MPI_INT, 0, MPI_COMM_WORLD);
if (rank == 0) {
printf("4. Processor %d has data: ", rank);
for (i=0; i<size; i++)
printf("%d ", globaldata[i]);
printf("\n");
}
MPI_Finalize();
return 0;
}
享受学习 MPI 吧! :-)
关于c - 如何使用 MPI 分散和收集数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40080362/
TL;DR:问题:是否有一种快速方法可以在特定坐标处插入分散的二维数据集? 如果是的话,有人可以提供一个示例,其中包含“当前解决方案”中使用的示例数据和变量(因为我自己实现它显然很愚蠢)。 问题:
我正在使用 n = 2 运行我的代码。我一直在尝试研究,但我不明白为什么当我尝试多次运行我的代码时会获得不同的输出。 在下面,您可以看到当我使用 n = 2 运行时的输出,并且我的 txt.file
我正在处理 BML 自动机的 MPI 版本,但 MPI_Scatter() 不会像我预期的那样工作。我读了here对于集体通信功能,每个进程都需要它的数组副本,只是没有初始化的分配空间。在我的代码中,
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 已关闭 6 年前。 Improve
我需要将输入字符串拆分为输出字符串(按一定顺序)通过在输入字符串上应用一组正则表达式。我想实现这个功能与 akka Actor 集群一起使用,我将其分散正则表达式和输入字符串并收集字符串。不过我想知道
我在使用 MPI4Py Python 模块中的 Scatter 函数时遇到问题。我的假设是我应该能够向它传递发送缓冲区的单个列表。但是,当我这样做时,或者确实添加其他两个参数,recvbuf 和 ro
我的问题是,我想用与所有其他点不同的颜色绘制此结构的 0,0,0 点。但是绘图只显示所选颜色的轮廓,而这个球的内部仍然是相同的颜色其他的。我不明白这是怎么回事。 from mpl_toolkits.m
我正在尝试使用克隆调用两个端点并收集它们的信息以通过聚合发送,我必须将其与分散收集中介器一起使用。每个端点返回一个 json 字符串。但我一直遇到“期望 SOAP Envelope 的实现作为父级”错
我正在构建一个 Angular 元素,我在其中使用预先设计的 html 模板。我在加载页面时使用延迟加载,我不完全知道如何描述这个问题,我只能说当我加载页面时,css 得到分散,如我附上的 gif 所
plotly.js 新手(我处于 Angular 环境中) 我想将痕迹放在多选下拉菜单中。所有 y 轴都相同。能够切换这些的可见性。建议...简单/正确的方法。 我尝试用 css 影响 svg 容器,
我一直在尝试弄清楚我们应该如何使用 AVX512 中的分散指令来分散 16 位整数。我所拥有的是 8 x 16 位整数,存储在 __m256i 的每个 32 位整数中。我会使用 _mm512_i32e
我正在编写一个FUSE覆盖文件系统(notifyfs),它可以是一个数据库客户端可以从中获取数据通过查询。我的目的是使其成为缓存/overlayfs/数据库,客户端可以在显示条目及其属性(属性以及 m
我已经搜索了一段时间,但似乎无法在文档或 SO 上找到任何有用的信息。 This question并没有真正帮助我,因为它引用了修改程序集,而我正在用 C 语言编写。 我有一些代码进行间接访问,我想对
我正在通过分散模型、蓝图来重构我的 Flask 应用程序,但我遇到了运行时错误。 def create_app(): app = flask.Flask("app") app.conf
大多数 pyplot 示例都使用线性数据,但如果数据是分散的呢? x = 3,7,9 y = 1,4,5 z = 20,3,7 更好的 contourf 网格 xi = np.linspace(min
我可以合并 Mono> 的列表吗?数据源整合为单个Mono>包含所有项目而不阻塞? 在我的带有 Lombok 分散收集应用程序的 JDK 9 Spring Boot 2 中,此阻塞版本有效:
我正在使用 FFCalender .在那个 MonthView 中分散了 在模拟器 iPad 2 8.0、iPad 2 7.0、iPad Retina 7.0 和 iPad Retina 8.0 中没
我是一名优秀的程序员,十分优秀!