首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何初始化两个不同的blacs上下文?

如何初始化两个不同的blacs上下文?
EN

Stack Overflow用户
提问于 2015-06-09 15:09:42
回答 1查看 282关注 0票数 4

我有一台带有nproc处理器的计算机,我想初始化两个blacs网格,一个是维p x q = nprocs,另一个是维1 x 1

假设MPI已经初始化,并且例程找到了良好的块大小,则第一个网格将通过

代码语言:javascript
复制
call blacs_get(   -1, 0, self%context  )
call blacs_gridinit( self%context, 'R', self%nprows, self%npcols )
call blacs_gridinfo( self%context, self%nprows, self%npcols, self%myrow, self%mycol )

但我该怎么安排第二个呢?我必须先介绍另一个mpi通信器吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-10 08:53:02

作为一个答案和例子,我分享这个实现:

代码语言:javascript
复制
    call blacs_get(   -1, 0, self%context  )
    call blacs_gridinit( self%context, 'R', self%nprows, self%npcols )
    call blacs_gridinfo( self%context, self%nprows, self%npcols, self%myrow, self%mycol )

    print*, "A ", self%context, self%nprows, self%npcols, self%myrow, self%mycol

    call sleep(1)

    call blacs_get(   -1, 0, val  )
    call blacs_gridinit( val, 'R', 1, 1 )
    call blacs_gridinfo( val, self%nprows, self%npcols, self%myrow, self%mycol )

    call sleep(1)

    print*, "B ", val, self%nprows, self%npcols, self%myrow, self%mycol

    call sleep(1)

    call blacs_get(   -1, 0, val2  )
    call blacs_gridinit( val2, 'R', 2, 2 )
    call blacs_gridinfo( val2, self%nprows, self%npcols, self%myrow, self%mycol )

    call sleep(1)
    print*, "C ", val2, self%nprows, self%npcols, self%myrow, self%mycol

它添加了三个blacs上下文,不需要初始化另一个MPI通信器,相当于四个核心上的以下输出:

代码语言:javascript
复制
 A            0           2           2           1           1
 A            0           2           2           0           0
 A            0           2           2           1           0
 A            0           2           2           0           1




 B           -1          -1          -1          -1          -1
 B           -1          -1          -1          -1          -1
 B           -1          -1          -1          -1          -1
 B            1           1           1           0           0




 C            1           2           2           1           0
 C            1           2           2           1           1
 C            1           2           2           0           1
 C            2           2           2           0           0

因此,关键的一点是,blacs_gridinit的第一个参数是输入/输出参数,需要所有进程的globale上下文作为输入。它通过调用blacs_get (第三个参数)在一个新变量中接收。

在本例中,我发现的是,上下文的值似乎遵循某种求和规则,因此在初始化1x1网格和再次初始化4x4网格之后,4x4网格句柄的值在所有进程中都不一样。

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

https://stackoverflow.com/questions/30735995

复制
相关文章

相似问题

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