Julia 中的分布式阵列初始化



我正在寻求有关 julia 编程的帮助。 我是编程新手,对计算机和编程的结构知之甚少,所以如果我问一些愚蠢的问题,请原谅我。

我必须做大量的计算,所以我想对双 for 语句使用并行计算。代码如下:

using Distributed
@everywhere using DistributedArrays
addprocs(4)
function FreeSpace_2D(profile, x_prime, y_prime, d, x, y) 
# profile is a 2D array, and x_prime and y_prime are 1D arrays. d, x, y is real numbers.
Nx = length(x_prime)
Ny = length(y_prime)
array = dzeros((Nx, Ny), workers()[1:4], [1, 4])
@distributed for i in 1:Nx
@distributed for j in 1:Ny
localpart(array)[i, j] = ( profile[i, j]*exp(-1im*0.5*k/d*((x-x_prime[i])^2+(y-y_prime[j])^2)) )
end
end
return array 
end 

但是代码不会初始化"数组"。

当我搜索互联网时,有几种方法可以使用分布式初始化 1D 数组,但它们不适用于 2D 数组。

我将不胜感激任何帮助。

您的代码有四个问题:

  • 您需要先addprocs,然后调用@everywhere。否则,您的@everywhere将仅在主进程上调用
  • 您需要通过将宏放在@distributed之前来同步@distributed循环@sync或者提供一个聚合器函数,即:@distributed (some_func) for i in 1:1000
  • @distributed循环将代码分发到所有可用的工作线程。因此,将一个@distributed循环包含在另一个循环中是没有意义的。我建议仅将@distributed放在外部回路的前面
  • 您需要在每个工作节点上使用阵列的本地部分

这是我尝试制作的示例代码,类似于您的目标并且工作正常:

using Distributed
addprocs(4)
@everywhere using Distributed
@everywhere using DistributedArrays
a = dzeros(Int, (4, 8), workers()[1:4], [1, 4])
@sync @distributed for j in 1:8
a_local = localpart(a)
for i in 1:4
a_local[i, ((j+1) % 2)+1 ] = 100j + 10i + myid() 
end
end

查看Arraya揭示了发生了什么:

julia> a
4×8 DArray{Int64,2,Array{Int64,2}}:
112  212  313  413  514  614  715  815
122  222  323  423  524  624  725  825
132  232  333  433  534  634  735  835
142  242  343  443  544  644  745  845

最新更新