gpt4 book ai didi

c - 我需要帮助将 C 代码转换为 MPI

转载 作者:行者123 更新时间:2023-11-30 21:00:27 25 4
gpt4 key购买 nike

我现在拥有一个带有 MPI 运行时的 SGE 集群。作为初学者,我希望有人帮助我将 C 代码翻译为 MPI,以便稍后使用 SGE 队列系统运行它,但我不明白。

我在 C: 中添加顺序代码

int initialize (double **A, int n)
{
int i,j;
for (j=0;j<n+1;j++){
A[0][j]=1.0;
}
for (i=1;i<n+1;i++){
A[i][0]=1.0;
for (j=1;j<n+1;j++) A[i][j]=0.0;
}

最佳答案

让我们重点关注我所理解的代码的相关部分(在删除 printf 和可能错误的 iters++ 之后):

for (for_iters=1;for_iters<21;for_iters++) 
{
diff = 0.0;
for (i=1;i<n;i++)
{
for (j=1;j<n;j++)
{
tmp = A[i][j];
A[i][j] = 0.8*(A[i][j] + A[i][j-1] + A[i-1][j] + A[i][j+1] + A[i+1][j]);
diff += fabs(A[i][j] - tmp);
}
}
if (diff/((double)N*(double)N) < Tolerance)
{
convergence=TRUE;
}
}

除了处理量太少,不足以证明并行化和分发算法所需的额外工作是合理的之外,根本问题是两个方向上都存在数据依赖性:A[i][j 的新值] 取决于 A[i][j] 的旧值并且:

  • A[i-1][j]和A[i][j-1]的新值;和
  • A[i+1][j] 和 A[i][j+1] 的旧值

由于这些依赖关系是双向的,因此您最终会在操作顺序上受到非常强的约束:

  • 对于所有 k>0,A[i][j+k] 的新值的计算必须在 A[i][j] 之后进行;和
  • A[i+1][j]的新值的计算必须在A[i][j+1]之后进行

有了这些约束,您可以想象在 N 个进程上并行执行,其中每个进程都会计算给定 i 值的新值,但您需要将第 i 行的处理器与第 i 行的处理器同步+1。

从概念上讲,它可能是这样的:

double line_processor(int i, double **A, int n)
{
// MPI: initialize communication with line processor for i-1
// MPI: initialize communication with line processor for i+1
double diff = 0.0;
for (int j=1;j<n;j++)
{
double tmp = A[i][j];
// MPI: wait for A[i-1][j+1] to be calculated
// MPI: get the new value of A[i-1][j]
A[i][j] = 0.8*(A[i][j] + A[i][j-1] + A[i-1][j] + A[i][j+1] + A[i+1][j]);
// MPI: signal that A[i][j] has been calculated
diff += fabs(A[i][j] - tmp);
}
// MPI: send the local value of diff for accumulation on the master process
return diff;
}

不幸的是,围绕 A[i][j] 计算的 MPI 等待和信令将比计算本身花费更多的时间,这将导致计算资源的使用效率极低,并且几乎肯定会导致执行速度变慢比顺序执行。

用于传输数据和同步进程的 MPI 语法的详细信息可能最好留在相关教程中,而不是在此处复制/粘贴。

如果您有一个非常大的矩阵,那么重新审视该问题并考虑对矩阵进行切片将变得有意义。

关于c - 我需要帮助将 C 代码转换为 MPI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41290204/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com