问题标签 [scalapack]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
fortran - 如何使用 pdgemr2d 将分布式矩阵复制到所有进程?
我想复制一个 (nxn) 矩阵,该矩阵分布在 (pxq) 进程网格上到所有进程,以便每个进程都有整个 (nxn) 矩阵,类似于来自 mpi 的 allgather 操作。
我知道 scalapacks pdgemr2d 例程是要走的路,但是示例和文档并没有帮助我弄清楚。我的想法是引入第二个 blacs 上下文,它只包含一个进程,它也是 mpi_root。pdgemr2d 将所有信息复制到这个 1x1 网格。mpi_root 然后广播到所有其他进程。
我正在使用 scalapack/blacs 的 fortran 接口。
这里有一堆问题:
- 我上面的想法是理智的还是有更好的性能的(规范的)方法?
- 在这个上下文中有很多上下文,我不完全理解,如果我正确地将它们分开:我所有的 pxq 进程都在 MPI_WORLD_COMMUNICATOR 中,这个通信器也用作网格的 blacs 上下文。然后根是 MPI_WORLD、网格上下文和 1x1 上下文的一部分。所以它有一大块数据,也应该以某种方式从 pxq-context 发送到 1x1-context。这是正确的,这甚至有效吗?
- pdegemr2d 的最后一个参数是 ictxt,它应该是所有参与进程的上下文统一,这是 MPI_WORLD 吗?
- 我需要对 pxq-grid 的成员和 1x1-grid 的一个成员进行不同的调用吗?如果是这样,有什么区别?
fortran - 如何初始化两个不同的 blacs 上下文?
我有一台带有nproc
处理器的计算机,我想初始化两个 blacs 网格,一个是维度p x q = nprocs
,一个是维度1 x 1
。
假设 MPI 已经初始化并且例程找到好的块大小,第一个网格通过以下方式初始化
但是如何设置第二个?我必须先介绍另一个mpi通信器吗?
c - 在进入 NIT 参数号 9 时具有非法值
我从Intel 11转到这个ex1.c文件。但是,当我执行它时,它失败了:
为什么?这是我第一次使用 ScaLAPACK 运行示例,我不知道发生了什么。
c++ - 对 pdpotrf 参数感到困惑
我想在分布式环境中进行 Cholesky 分解。为此,我使用pdpotrf()。但是,我很难理解函数所需的参数,并且它们没有提供关于如何使用它的 C 示例(如果有一个示例真的很棒)。
假设我有一个想要分解的 NxX 矩阵。那么,参数应该有什么值呢?uplo
,a
并且info
在我的脑海中定义得很好。其余的呢?
n
应该等于 NI 会说。但是,desca
和ia
是ja
让我感到困惑的。而且,desca
是全局的和本地的,我无法理解的东西。有人可以解释吗?也许有一个方法示例(不一定是代码,因为我想理解,而不仅仅是复制粘贴)。
我不知道任何Fortran。
matrix - 了解块和块循环矩阵分布
在处理矩阵的并行分解时,我熟悉块分布,我们有(比如说)4 个进程,每个进程都有自己的矩阵子区域:
因此,例如在这里我们有一行中的进程数 ( procrows
) 等于 2,一列中的进程数 ( proccols
) 也等于 2,如果原始矩阵大小为,则子矩阵A_local
的大小为。N/2 x M/2
N x M
我正在阅读这个使用“块循环”分布的例子,在这一部分:
它们有procrows
并且proccols
是硬编码的,很好,但是对于读入的矩阵,有一个标题:
Nb 和 Mb 将是 [矩阵] 块的行数和列数
我不明白这一点;不是完全由 N、M、procrows 和 proccols 决定的吗Nb
?Mb
编辑
从运行示例中,我可以看到进程 0 上的子矩阵具有矩阵左上角的所有元素,就像我上面的图片一样,这与乔纳森的回答相矛盾。但是,它适用于 ScaLAPACK 的 Cholesky。
c++ - Cholesky 与 ScaLAPACK
我正在尝试通过使用 ScaLAPACK 的 MKL-Intel 库的pdpotrf()进行 Cholesky 分解。我正在读取主节点中的整个矩阵,然后像本例中那样分发它。当 SPD 矩阵的维数是偶数时,一切正常。但是,当它很奇怪时,pdpotrf()
认为矩阵不是正定的。
可能是因为子矩阵不是 SPD 吗?我正在使用这个矩阵:
子矩阵是(有 4 个进程和大小为 2x2 的块):
在这里,每个子矩阵都不是 SPD,但是,整个矩阵是 SPD(已检查运行 1 个进程)。我该怎么办?还是我无能为力,pdpotrf()
也不能处理奇数大小的矩阵?
这是我调用例程的方式:
我也试过这个:
但我收到一个错误:
{ 0, 0}:进入 { 0, 1}:进入 PDPOTR{ 1, 0}:进入 PDPOTRF 参数编号 605 时具有非法值 { 1, 1}:进入 PDPOTRF 参数编号 605 时具有非法值 F 参数号 605 具有非法值
PDPOTRF 参数编号 605 具有非法值 info < 0:如果第 i 个参数是一个数组并且第 j 项具有非法值,则 INFO = -(i*100+j),如果第 i 个参数是一个标量并且有一个非法值,那么 INFO = -i。信息 = -605
从我的回答中,您可以看到函数的参数是什么意思。
代码基于这个问题。输出:
c++ - 我应该在调用 pdpotri() 之前设置障碍吗?
我正在使用pdpotrf()来执行 Cholesky 分解。然后我想调用pdpotri()来反转矩阵。该函数从每个进程调用,就在pdpotrf()
. 我应该在那里设置一个障碍,以便我确定所有过程都通过 Cholesky 分解完成,然后继续进行反演部分,还是不需要?
我写了一些输入很小的例子,这表明它不是必需的,但我想确定我不只是(不)幸运并且面临更大输入的问题。
请注意,我所说的障碍是指:MPI_Barrier(MPI_COMM_WORLD);
编辑
我只是担心在其他一些过程终止 Cholesky 分解之前可能会开始反转。pdpotri()
照顾这个吗?我的意思是,如果需要,它会检查并等待。还是pdpotri()
仅在其调用过程的子矩阵中起作用?如果是这样,则不需要屏障。
c++ - ScaLAPACK 中不同大小的块?
我正在使用使用 ScaLAPACK 的 Intel-MKL 执行 Cholesky 分解。我根据这个例子分发了矩阵,其中矩阵分布在大小相等的块中(即 Nb x Mb)。我试图让每个块都有自己的大小,具体取决于它属于哪个进程,这样我就可以进行更多实验,也许会获得更好的性能。
检查这个问题,以便更好地理解我在说什么。我不会发布我的代码,因为它太大了(是的,小例子也太大了,我检查了)并且分发似乎运行良好。但是,ScaLAPACK 似乎假设矩阵分布在大小相等的块中?
例如,我正在使用这个:
其中(取自手册):
NB(全局输入)整数块大小,分布式矩阵被分割成的块的大小。
那么,ScaLAPACK 是否允许具有不相等块大小的分布式矩阵?
如果我打印这样的信息,对于 8x8 矩阵:
我得到这个:
只需交换前两个块大小,即可:
这对于 8x8 矩阵没有意义。
c++ - 修复分布式版本中的算术错误
我在分布式环境中通过 Cholesky 分解来反转矩阵,正如在此处讨论的那样。我的代码工作正常,但为了测试我的分布式项目是否产生正确的结果,我不得不将它与串行版本进行比较。结果不完全一样!
例如,结果矩阵的最后五个单元格是:
我曾在英特尔论坛上发过帖子,但我得到的答案是在我将使用分布式版本进行的所有执行中获得相同的结果,这是我已经拥有的。他们似乎(在另一个线程中)无法对此做出回应:
如何在串行和分布式执行之间获得相同的结果?这可能吗?这将导致修正算术错误。
我试过设置这个:mkl_cbwr_set(MKL_CBWR_AVX);
并使用mkl_malloc()
, 来对齐内存,但没有任何改变。我会得到相同的结果,只是在我将为分布式版本生成一个进程的情况下(这将使它几乎是串行的)!
fortran - 在 Fortran 中使用 SCALAPACK 的分段错误?没有回溯?
我正在尝试在 Fortran 中使用 SCALAPACK 和 MPI 查找 Hermitian 矩阵的特征值和特征向量。对于错误压缩,我使这个程序尽可能简单,但仍然遇到分段错误。根据给有类似问题的人的答案,我尝试将所有整数更改为整数 * 8,将所有实数更改为 real * 8 或 real * 16,但我仍然遇到这个问题。最有趣的是,我什至没有得到分段错误的回溯:程序在尝试给我回溯时挂起,必须手动中止。
另外,请原谅我缺乏知识——我对大多数程序方面的东西都不熟悉,但我已经尽力了。这是我的代码:
问题在于第二个 PZHEEVX 函数。我相当确定我正确使用了它,因为这段代码是另一个更复杂的代码的更简单版本,可以正常工作。为此,我只使用一个处理器。
帮助!