MPI_SCATTER Fortran 矩阵(按行)

Posted

技术标签:

【中文标题】MPI_SCATTER Fortran 矩阵(按行)【英文标题】:MPI_SCATTER Fortran Matrices by Rows 【发布时间】:2011-01-30 13:10:13 【问题描述】:

按行而不是按列分散 Fortran 90 矩阵的最佳方法是什么?也就是说,假设我有一个矩阵 a(4,50),我想将它 MPI_SCATTER 放到两个进程上,其中每个部分都是 alocal(2,50),其中等级 0 有第 1 行和第 2 行,等级 1 有 3 和4. 现在,在 C 中,这很简单,因为数组是行优先的,但在 Fortran 90 中,它们是列优先的。

我试图避免在散射之前使用 TRANSPOSE 来翻转 a(即,内存使用量加倍),我认为 MPI 中必须有一种方法可以做到这一点。会是 MPI_TYPE_VECTOR 吗? MPI_TYPE_CREATE_SUBARRAY?

同样,如果我有一个 3d 数组 b(4,50,3),我想要两个分散的 blocal(2,50,3) 矩阵,如上分布?

【问题讨论】:

【参考方案1】:

是的,MPI_TYPE_VECTOR 和 MPI_TYPE_CREATE_SUBARRAY 是你想要的。前者用于您的第一个问题,后者用于您的第二个问题。如果你想让我为你写电话,请发表评论!

【讨论】:

我可能想知道你的技术,因为我似乎都无法工作。 VECTOR 不断发送垃圾邮件,而 SUBARRAY 调用似乎不想与 SCATTER 一起使用。排名为 0 时散布得很好,但排名为 1 时没有。我是否需要广播我的大数组,以便在我执行 SUBARRAY 时每个人都能看到它?如果是这样,那么 BCAST 会更容易,然后只使用数组切片。或者,也许我需要使用 SCATTERV? 对不起@Fortran,走了。你解决了吗?如果没有,我明天试着回答。【参考方案2】:

大多数 MPI 数据传输调用没有stride 参数吗?将其设置为数据类型的大小乘以矩阵的高度,然后就可以了...

我查看了MPI reference 并没有明确的论据,但是如果您转到示例 5.12,它们将展示如何使用 MPI_ScattervMPI_Gatherv 发送跨步整数。

【讨论】:

以上是关于MPI_SCATTER Fortran 矩阵(按行)的主要内容,如果未能解决你的问题,请参考以下文章

fortran语言矩阵求逆

按行名过滤矩阵的嵌套列表

Matlab:按行组合多个矩阵

如何在 Fortran 中有效地计算矩阵内积?

为什么犰狳矩阵计算比Fortran慢得多

在fortran中使用openmp并行创建稀疏矩阵