- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
好吧,我正在使用 MPI + C 做一些作业。事实上,我只是写了 Peter Pacheco 的书中的编程作业 3.2 的一小段代码,称为并行编程简介。该代码似乎适用于 3 或 5 个进程...但是当我尝试超过 6 个进程时,程序就会中断。
我正在使用一种非常“糟糕”的调试方法,即放置一些 printfs 来跟踪问题发生的位置。使用这种“方法”,我发现在 MPI_Reduce 之后,出现了一些奇怪的行为,并且我的程序对等级 ID 感到困惑,特别是等级 0 消失了,并且出现了一个非常大(且错误)的等级。
我的代码在下面,在它之后,我发布了 3 和 9 个进程的输出......我正在运行
mpiexec -n X ./name_of_program
其中 X 是进程数。
我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>
int main(void)
{
MPI_Init(NULL,NULL);
long long int local_toss=0, local_num_tosses=-1, local_tosses_in_circle=0, global_tosses_in_circle=0;
double local_x=0.0,local_y=0.0,pi_estimate=0.0;
int comm_sz, my_rank;
MPI_Comm_size(MPI_COMM_WORLD, &comm_sz);
MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
if (my_rank == 0) {
printf("\nEnter the number of dart tosses: ");
fflush(stdout);
scanf("%lld",&local_num_tosses);
fflush(stdout);
}
//
MPI_Barrier(MPI_COMM_WORLD);
MPI_Bcast( &local_num_tosses, 1, MPI_LONG_LONG_INT, 0, MPI_COMM_WORLD);
MPI_Barrier(MPI_COMM_WORLD);
srand( rand() ); //tried to improve randomness here!
for (local_toss=0;local_toss<local_num_tosses;local_toss++) {
local_x = (-1) + (double)rand() / (RAND_MAX / 2);
local_y = (-1) + (double)rand() / (RAND_MAX / 2);
if ( (local_x*local_x + local_y*local_y) <= 1 ) {local_tosses_in_circle++;}
}
MPI_Barrier(MPI_COMM_WORLD);
MPI_Reduce
(
&local_tosses_in_circle,
&global_tosses_in_circle,
comm_sz,
MPI_LONG_LONG_INT,
MPI_SUM,
0,
MPI_COMM_WORLD
);
printf("\n\nDEBUG: myrank = %d, comm_size = %d",my_rank,comm_sz);
fflush(stdout);
MPI_Barrier(MPI_COMM_WORLD);
if (my_rank == 0) {
pi_estimate = ( (double)(4*global_tosses_in_circle) )/( (double) comm_sz*local_num_tosses );
printf("\nPi estimate = %1.5lf \n",pi_estimate);
fflush(stdout);
}
MPI_Finalize();
return 0;
}
现在,2 个输出:
(i) 对于 3 个进程:
Enter the number of dart tosses: 1000000
DEBUG: myrank = 0, comm_size = 3
DEBUG: myrank = 1, comm_size = 3
DEBUG: myrank = 2, comm_size = 3
Pi estimate = 3.14296
(ii) 对于 9 个进程:(注意\n 输出很奇怪,有时它不起作用)
Enter the number of dart tosses: 10000000
DEBUG: myrank = 1, comm_size = 9
DEBUG: myrank = 7, comm_size = 9
DEBUG: myrank = 3, comm_size = 9
DEBUG: myrank = 2, comm_size = 9DEBUG: myrank = 5, comm_size = 9
DEBUG: myrank = 8, comm_size = 9
DEBUG: myrank = 6, comm_size = 9
DEBUG: myrank = 4, comm_size = 9DEBUG: myrank = -3532887, comm_size = 141598939[PC:06511] *** Process received signal ***
[PC:06511] Signal: Segmentation fault (11)
[PC:06511] Signal code: (128)
[PC:06511] Failing at address: (nil)
--------------------------------------------------------------------------
mpiexec noticed that process rank 0 with PID 6511 on node PC exited on signal 11 (Segmentation fault).
--------------------------------------------------------------------------
最佳答案
当 MPI_Reduce 的第三个参数时对我有用是1
,不是comm_size
(因为每个缓冲区的元素个数是1):
MPI_Reduce
(
&local_tosses_in_circle,
&global_tosses_in_circle,
1, //instead of comm_size
MPI_LONG_LONG_INT,
MPI_SUM,
0,
MPI_COMM_WORLD
);
当您增加进程数时,MPI_Reduce
会覆盖函数堆栈中的其他内容,例如my_rank
和 comm_sz
,并破坏了数据。
此外,我认为您不需要任何 MPI_Barrier
语句。 MPI_Reduce
和 MPI_Bcast
无论如何都是阻塞的。
我不会担心换行符。它们并没有丢失,但在输出的其他地方,可能是因为许多进程同时写入标准输出。
顺便说一句:使用 printf
进行调试非常普遍。
关于c - 使用 MPI_Reduce 的等级 ID 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15884547/
我对 MPI 很陌生,我正在尝试使用 MPI_Reduce 来查找整数数组的最大值。我有一个整数数组 arr尺寸arraysize ,这是我的代码: MPI_Init(&argc, &argv); M
我在 fortran 中遇到 MPI_REDUCE() 的精度问题。我测试了两种对存储在每个节点上的 double 数字求和的方法。我使用的 MPI_REDUCE() 行是 call MPI_REDU
只是一个问题。如果我使用函数 MPI_Reduce,只有根可以分配接收缓冲区,当这是一个动态数组时?。例如: int r = 10; int *yloc, *y; ... yloc = calloc(
我正在尝试使用 MPI_reduce() 计算跨进程分布的 1000 个数字的平均值。不幸的是,到目前为止,我的代码只给出零,而不是预期的答案(数字的算术平均值)。 我做错了什么? #include
MPI documentation断言接收缓冲区 (recvbuf) 的地址中的地址仅在根目录下才有意义。这意味着可能不会在其他进程中分配内存。 this question 证实了这一点. int M
我正在尝试在 C(或 C++)中使用 MPI_REDUCE 来查找数组中的最小值(和索引)。我有这个适用于常规数组,但现在我想切换到一个动态计算值的数组。即 arr[n] 的值是通过调用 fun(n)
我开始研究使用 C 和 OpenMPI 库进行并行编程。所以现在一切看起来都太复杂了。 我正在尝试做一个单程序多数据:掌握:- 初始化一个数组- segmentation 它- 将相同大小的位发送到不
我最近遇到了一个堰行为。如果我在我的机器上运行以下代码(使用最新版本的 cygwin,Open MPI 版本 1.8.6),我会得到一个线性增长的内存使用量,这很快就会淹没我的电脑。 program
我试图将我的处理器分成几组,然后添加每组的总和独立地......但直到现在我还无法正确找到结果。一个简单的例子如下: int main(int argc, char** argv) { int
我得到了一个小练习,我必须通过使用 MPI 来估计 n 个球体的总体积来实现蒙特卡罗算法,这些球体的中心坐标和半径在 3 维中。即使我们必须使用 MPI,我们也可以在本地机器上启动所有进程,因此没有网
我正在尝试找到随机生成的数字的最大值。对此有任何想法... 我正在使用 MPI_Scatter 将随机生成的数字分成相等的进程。我正在使用 MPI_Reduce 从每个进程中获取最大值。 #inclu
我正在尝试做一些简单的 MPI 项目(w MPICH),但在这样做时我遇到了一个我既不理解也无法解决的问题(可能是因为我误解了文档)。所以我基本上想做的是将一个结构传递给 MPI_Reduce,以便对
我的 MPI 代码有问题,当代码在多个节点 上运行时挂起。它在单个节点 上运行时成功 完成。我不确定如何调试它。有人可以帮我调试这个问题吗? 程序使用: mpicc -o string strin.c
我有一个顺序程序,它计算数值并将结果存储在一个数组中,其中每个元素代表一个数字“位置”。 例如,一个计算结果[2,4,5,1,1,8,9,3,1]表示一个十进制值2.45118931 格式是resul
当使用 MPI_reduce 时,根处理器是否也对自身应用指定的 MPI 操作? 例如,假设以下代码由包括 root 在内的所有处理器运行,root 是否将它的 local_sum 减少为 globa
我学会了使用一些 MPI 函数。当我尝试使用 MPI_Reduce 时,我在运行代码时收到检测到堆栈粉碎: #include #include #include void main(int ar
我有两个程序。产生执行一些计算的“ worker ”的“主人”,我希望主人从 worker 那里得到结果并存储总和。我正在尝试使用 MPI_Reduce 从 worker 那里收集结果,而 worke
我不明白为什么一旦我使用包含动态分配数组的自定义 MPI 数据类型,MPI_Reduce() 就会出现段错误。有人知道吗 ?以下代码在 MPI_Reduce() 内部使用 2 个处理器时会崩溃。但是,
我正在尝试使用 MPI 库用 C 语言编写程序。在我的程序中,我正在解决 TSP(但没有使用任何特殊算法......)。我的输入参数是int nCites , int xCoord[]和 int yC
我需要缩减节点从其他节点获取元素列表的拷贝(存储在 vector 中)。我定义了自己的还原函数,但它不起作用。程序终止/崩溃。 这是代码: #include #include "mpi.h" #in
我是一名优秀的程序员,十分优秀!