首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >comm_sz与迭代次数的关系

comm_sz与迭代次数的关系
EN

Stack Overflow用户
提问于 2022-03-07 21:34:27
回答 1查看 54关注 0票数 -1

我有几个问题,重新分级MPI程序。我阅读了PeterS.Pacheco的“--并行编程简介”,第二版。在本书第三章,第3.2.2节Parallelizing the trapezoidal rule程序3.2 First version of MPI trapezoidal rule. (书104页)在检查程序时产生疑问。第12行local_n = n / comm_sz ;造成了混乱。根据程序n =1024和comm_sz,任何2的乘法,如2,4,6,8。所以1024可以被comm_sz整除。现在,如果n(1024)不能被comm_sz整除,那么在这种情况下,在编程中我们需要修改什么。

例如,n= 1022和comm_sz = 8。

第二个问题,为什么我们使用2的comm_sz乘法?

代码语言:javascript
复制
1. int main ( void ) {
2 int my_rank , comm_sz , n = 1024, local_n ;
3 double a = 0.0 , b = 3.0 , h , local_a , local_b ;
4 double local_int , total_int ;
5 int source ;
6
7 MPI_Init ( NULL , NULL ) ;
8 MPI_Comm_rank ( MPI_COMM_WORLD , &my_rank ) ;
9 MPI_Comm_size ( MPI_COMM_WORLD , &comm_sz ) ;
10
11 h = ( b−a ) / n ; / ∗ h i s the same for all processes ∗ /
12 local_n = n / comm_sz ; / ∗ So i s the number of t r a pe z oid s ∗ /
13
14 local_a = a + my_rank ∗ local_n ∗h ;
15 local_b = local_a + local_n ∗h ;
16 local_int = Trap ( local_a , local_b , local_n , h ) ;
17
18 if ( my_rank != 0) {
19 MPI_Send (&local_int , 1, MPI_DOUBLE , 0, 0,
20 MPI_COMM_WORLD ) ;
21 } else {
22 total_int = local_int ;
23 for ( source = 1; source < comm_sz ; source ++) {
24 MPI_Recv (&local_int , 1, MPI_DOUBLE , source , 0,
25 MPI_COMM_WORLD , MPI_STATUS_IGNORE ) ;
26 total_int += local_int ;
27 }
28 }
29
30 i f ( my_rank == 0) {
31 printf ( "With n = %d trapezoids , our estimate\n" , n ) ;
32 printf ( "of the integral from %f to %f = %.15e\n" ,
33 a , b , total_int ) ;
34 }
35 MPI_Finalize ();
36 return 0 ;
37 } / ∗ main ∗ /
EN

回答 1

Stack Overflow用户

发布于 2022-03-08 07:48:57

我认为有必要查看完整的代码,以便在代码中看到local_n的影响。尽管如此,如果您想知道如何处理n/comm_sz不可分的场景,那么可以通过多种方式完成。

一种简单的方法是将n%comm_sz添加到最后一个进程的local_n中。缺点:最后一个进程的local_n比其他进程要大。

另一种方法是计算n%comm_sz并在所有进程中跨local_n分配mod值。优点: mod值有一个更好的分布。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71387518

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档