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

时间:2015-06-09 15:09:43

标签: fortran scalapack

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

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

初始化
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通讯器?

1 个答案:

答案 0 :(得分:0)

作为答案和示例,我分享了这个实现:

    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通信器,并在四个核心上相当于以下输出:

 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上下文作为输入。它通过调用blacs_get,第三个参数在一个新变量中获得。

在这种情况下我发现相当直观的事实是,上下文的值似乎遵循某种求和规则,所以在初始化1x1网格然后再次是4x4网格之后,4x4网格的值句柄在所有过程中都不一样。