Julia 中的分布式数组初始化

Distributed Arrays initialization in Julia

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

我要进行大量计算,所以我想对 double 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 

但是代码没有初始化 'array'。

当我在网上搜索时,有几种使用分布式初始化一维数组的方法,但它们不适用于二维数组。

如有任何帮助,我将不胜感激。

你的代码有四个问题:

  • 你需要先addprocs然后再调用@everywhere。否则你的 @everywhere 将只在主进程上被调用
  • 您需要通过将 @sync 宏放在 @distributed 之前来同步 @distributed 循环,或者提供一个聚合函数,即:@distributed (some_func) for i in 1:1000
  • @distributed 循环将代码分发给所有可用的 worker。因此,将一个 @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

查看 Array a 揭示发生了什么:

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