如何初始化两个不同的 blacs 上下文?
How to initialize two distinct blacs contexts?
我有一台带有 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 communicator?
作为答案和例子,我分享这个实现:
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 的第一个参数是一个 input/output 参数,需要所有进程的 globale blacs 上下文作为输入。它通过调用 blacs_get,第三个参数在新变量中接收。
我发现在这种情况下非常违反直觉的事实是,上下文的值似乎遵循某种求和规则,因此在初始化 1x1 网格然后再次初始化 4x4 网格之后, 4x4 网格句柄在所有进程上都不相同。
我有一台带有 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 communicator?
作为答案和例子,我分享这个实现:
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 的第一个参数是一个 input/output 参数,需要所有进程的 globale blacs 上下文作为输入。它通过调用 blacs_get,第三个参数在新变量中接收。
我发现在这种情况下非常违反直觉的事实是,上下文的值似乎遵循某种求和规则,因此在初始化 1x1 网格然后再次初始化 4x4 网格之后, 4x4 网格句柄在所有进程上都不相同。