ScaLAPACK 中不同大小的块?
Blocks of different sizes in ScaLAPACK?
我正在使用 Intel-MKL 执行 Cholesky 分解,它使用 ScaLAPACK。我根据这个 example 分配了矩阵,其中矩阵分布在大小相等的块中(即 Nb x Mb)。我试着让每个块都有自己的大小,具体取决于它属于哪个进程,这样我就可以进行更多实验,也许会获得更好的性能。
检查此 ,以便更好地理解我在说什么。我不会 post 我的代码,因为它太大了(是的,这个小例子也太大了,我检查过)而且发行版似乎运行良好。但是,ScaLAPACK 似乎假设矩阵分布在大小相等的块中?
例如,我正在使用这个:
int nrows = numroc_(&N, &Nb, &myrow, &iZERO, &procrows);
int ncols = numroc_(&M, &Mb, &mycol, &iZERO, &proccols);
其中(取自 manual):
NB (global input) INTEGER
Block size, size of the blocks the distributed matrix is
split into.
那么,ScaLAPACK 是否允许块大小不相等的分布式矩阵?
如果我打印这样的信息,对于 8x8 矩阵:
std::cout << Nb << " " << Mb << " " << nrows << " " << ncols << " " << myid << std::endl;
我得到这个:
3 3 5 5 0
1 1 4 4 1
1 1 4 4 2
1 1 4 4 3
并且通过交换前两个块大小,这:
1 1 4 4 0
3 3 5 3 1
1 1 4 4 2
1 1 4 4 3
这对于 8x8 矩阵没有意义。
正如回答here,答案是否定的,你不能有不同大小的块。
我正在使用 Intel-MKL 执行 Cholesky 分解,它使用 ScaLAPACK。我根据这个 example 分配了矩阵,其中矩阵分布在大小相等的块中(即 Nb x Mb)。我试着让每个块都有自己的大小,具体取决于它属于哪个进程,这样我就可以进行更多实验,也许会获得更好的性能。
检查此
例如,我正在使用这个:
int nrows = numroc_(&N, &Nb, &myrow, &iZERO, &procrows);
int ncols = numroc_(&M, &Mb, &mycol, &iZERO, &proccols);
其中(取自 manual):
NB (global input) INTEGER Block size, size of the blocks the distributed matrix is split into.
那么,ScaLAPACK 是否允许块大小不相等的分布式矩阵?
如果我打印这样的信息,对于 8x8 矩阵:
std::cout << Nb << " " << Mb << " " << nrows << " " << ncols << " " << myid << std::endl;
我得到这个:
3 3 5 5 0
1 1 4 4 1
1 1 4 4 2
1 1 4 4 3
并且通过交换前两个块大小,这:
1 1 4 4 0
3 3 5 3 1
1 1 4 4 2
1 1 4 4 3
这对于 8x8 矩阵没有意义。
正如回答here,答案是否定的,你不能有不同大小的块。