1

我正在尝试运行此代码,但是为什么我要在中间使用 00000 得到这两行,有人可以帮我解决这个问题吗?

using Distributed #Bereitstellung der Bibliothekee zur Parallelen Programieru
addprocs(2)
@everywhere using LinearAlgebra #Bereitstellung der LinearAlgebra Bibliotheke
@everywhere using DistributedArrays #Bereitstellung der DistributedArrays 
@everywhere T =(zeros(n,n))
T[:,1].=10 #Randbedingungen T_links =10
T[:,end].=10 #Randbedingungen T_rechts =10
T = distribute(T; dist=(2,1))
@everywhere maxit = 100 #maximale Iterrationsanzahl
@everywhere function Poissons_2D(T)
    for w in 1:maxit
        @sync @distributed  for p in 1:nworkers()
            for i in 2:length(localindices(T)[1])-1
                for j in 2:length(localindices(T)[2])-1
                    localpart(T)[i,j] = (1/4 * (localpart(T)[i-1,j] + localpart(T)[i+1,j] + localpart(T)[i,j-1] + localpart(T)[i,j+1]))
                end
            end
        end
    end
    return T
end

Poissons_2D(T)
10×10 DArray{Float64,2,Array{Float64,2}}:
 10.0  0.0      0.0      0.0      …  0.0      0.0      0.0      10.0
 10.0  4.33779  2.00971  1.01077     1.01077  2.00971  4.33779  10.0
 10.0  5.34146  2.69026  1.40017     1.40017  2.69026  5.34146  10.0
 10.0  4.33779  2.00971  1.01077     1.01077  2.00971  4.33779  10.0
 10.0  0.0      0.0      0.0         0.0      0.0      0.0      10.0
 10.0  0.0      0.0      0.0      …  0.0      0.0      0.0      10.0
 10.0  4.33779  2.00971  1.01077     1.01077  2.00971  4.33779  10.0
 10.0  5.34146  2.69026  1.40017     1.40017  2.69026  5.34146  10.0
 10.0  4.33779  2.00971  1.01077     1.01077  2.00971  4.33779  10.0
 10.0  0.0      0.0      0.0         0.0      0.0      0.0      10.0
4

2 回答 2

2

第一次清理可能如下所示:

a =(zeros(10,10)) 
a[:,[1,end]] .= 10 
a = distribute(a; dist=(nworkers(),1))

function Poissons_2D(a::DArray, maxit::Int=100)
    for w in 1:maxit
        @sync @distributed  for p in 1:nworkers()
            local_a = localpart(a)
            local_ind = localindices(a)
            for iix in 1:length(local_ind[1])
                i = local_ind[1][iix]
        (i==1 || i==size(a,1)) && continue
                for j in local_ind[2][2:end-1]
                   local_a[iix,j] = (1/4 * (a[i-1,j] + a[i+1,j] + a[i,j-1] + a[i,j+1]))
                end
            end
        end
    end
    a
end

一些备注:

  • 不要在前面使用@everywhere T- 你不想在所有工作人员上定义它
  • 在 Julia 中,您按惯例使用T来表示参数类型,因此请使用a,或类似 T 的 LaTeX 符号

但是,您的函数会从所有相邻单元格中获取值来计算新值。我不知道您打算如何处理该值尚不存在的情况。

特别是如果每​​一行都需要前一行和前一列的值,则根本不可能并行化此计算(因为您需要等待前一个值才能获得下一个值)。

julia> Poissons_2D(a)
10×10 DArray{Float64,2,Array{Float64,2}}:
 10.0  0.0      0.0      0.0      0.0      0.0      0.0      0.0      0.0      10.0
 10.0  4.99998  3.05213  2.20861  1.87565  1.87565  2.20862  3.05214  4.99999  10.0
 10.0  6.9478   4.99994  3.90669  3.41834  3.41834  3.9067   4.99995  6.94781  10.0
 10.0  7.7913   6.09315  4.99989  4.47269  4.4727   4.99991  6.09317  7.79131  10.0
 10.0  8.12425  6.58148  5.52707  4.99987  4.99988  5.52709  6.58151  8.12427  10.0
 10.0  8.12425  6.58148  5.52707  4.99987  4.99988  5.52709  6.58151  8.12427  10.0
 10.0  7.7913   6.09316  4.99991  4.47271  4.47271  4.99992  6.09317  7.79131  10.0
 10.0  6.94781  4.99995  3.90671  3.41835  3.41836  3.90672  4.99996  6.94782  10.0
 10.0  4.99999  3.05214  2.20862  1.87566  1.87566  2.20863  3.05215  4.99999  10.0
 10.0  0.0      0.0      0.0      0.0      0.0      0.0      0.0      0.0      10.0
于 2020-11-17T20:08:16.413 回答
0

我认为问题在于 I 和 j 的范围。你的范围是从 2 到 N-1,避免极端。这是正确的,因为您缺少计算它们的信息,因为它存储在不同的过程中。但是,您需要传输限制信息。例如,在 MPI 中,您可以发送冗余信息来避免这种情况,但在分布式中我不确定。我看到了原因,但解决方案并不容易。至少我希望能有所帮助。

于 2020-11-17T19:12:00.047 回答