数据分布
ScaLAPACK是分布式接口,矩阵是分布在各进程上,而进程以进程网格形式排列,一般情况下进程网格是2D的,也存在1D的进程网格。进程网格由用户指定,存放在上下文句柄`ctxt`中,指定时需要通过blacs接口,例如
char layout='R'; // Block cyclic, Row major processor mapping int zero=0; blacs_get_(&zero, &zero, &ctxt); // -> Create context blacs_gridinit_(&ctxt, &layout, &P, &Q); // Context -> Initialize the grid blacs_gridinfo_(&ctxt, &nprow, &npcol, &myrow, &mycol); // Context -> Context grid info (# procs row/col, current procs row/col) … blacs_gridexit_(&ctxt);
其中,blacs_get_将系统默认上下文到其它blacs函数中,起到创建作用。blacs_gridinit正式指定进程网格的P和Q,这两个数都是整数,使用时必须保证P*Q<=MPI procs。blacs_gridinfo获取当前进程在进程网格中的位置,即当前进程在进程网格中的行数和列数。在scalapack所有函数调用结束后,blacs_gridexit_函数可以释放blacs进程网格信息。
在2D网格中,若进程形成的进程网格拥有P个进程行和Q个进程列,可以用它在进程网格中的坐标表示为(p,q),其中0≤p≤P,0≤q≤Q,下面为6个节点的进程分布。
上图中进程是以行优先顺序分布至进程网格上,除此之外还可以使用列优先顺序分布至进程网格上。在默认情况下,使用行优先顺序进行进程网格映射。
当进程网格确定后,矩阵按照预先设置的分块大小mb x nb,循环往复地分配至进程网格上。下面是将矩阵分布在进程网格上,各块所在的进程编号情况:
当P或Q被设置为1时,进程网格被设置为1D,在进程网格中的坐标可以按照进程编号设置为p或者q,其中0≤p≤P或0≤q≤Q。
将相同大小的矩阵分配至该1D进程网格上,矩阵划分及每个列块所在进程编号如下图所示:
上图为将P置为1的1D进程网格的数据分布情况,在实际应用中,也可以将Q置为1,此时进程网格上的数据块以行为基本划分单元。
父主题: 数据描述