行列の並列分解を扱う際に、ブロック分布に精通しています。ここでは、(たとえば) 4 つのプロセスがあり、それぞれに行列のサブ領域があります。
たとえば、ここでは、行 ( procrows
) のプロセス数が 2 に等しく、列 ( ) のプロセス数も 2 に等しく、元のマトリックス サイズが の場合、proccols
サブマトリックスのサイズは になります。A_local
N/2 x M/2
N x M
「ブロック循環」分布を使用するこの例を読んでいます。この部分では:
/* Begin Cblas context */
/* We assume that we have 4 processes and place them in a 2-by-2 grid */
int ctxt, myid, myrow, mycol, numproc;
int procrows = 2, proccols = 2;
Cblacs_pinfo(&myid, &numproc);
Cblacs_get(0, 0, &ctxt);
Cblacs_gridinit(&ctxt, "Row-major", procrows, proccols);
それらはハードコーディングされていますが、問題ありませんが、読み込まれたマトリックスの場合、ヘッダーがありますprocrows
。proccols
Nb と Mb は [行列の] ブロックの行と列の数になります。
これはわかりません。N、M、procrows、proccols によって完全に決定されるのではNb
ありませんか?Mb
編集
例を実行すると、プロセス 0 のサブマトリックスには、上の図のように、マトリックスの左上隅のすべての要素が含まれていることがわかります。これは、ジョナサンの答えと矛盾しています。ただし、ScaLAPACK の Cholesky では問題なく動作します。