---
title: 数据分布
description: "ScaLAPACK是分布式接口，矩阵是分布在各进程上，而进程以进程网格形式排列，一般情况下进程网格是2D的，也存在1D的进程网格。进程网格由用户指定，存放在上下文句柄`ctxt`中，指定时需要通过blacs接口，例如"
url: https://www.hikunpeng.com/document/detail/zh/kunpenghpcs/hpckit/devg/kunpengaccel_kml_0801.html
sourcePath: /source/zh/kunpenghpcs/hpckit/devg/kunpengaccel_kml_0801.html
indexId: ce23dc4a91f09fee3718df02adaab04217c27aa675c3aa7ed97af79612c8acb761
---
# 数据分布

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，此时进程网格上的数据块以行为基本划分单元。
