Arrays Julia中的分布式阵列初始化

Arrays Julia中的分布式阵列初始化,arrays,julia,calculation,Arrays,Julia,Calculation,我正在寻找朱莉娅编程方面的帮助。 我是一个编程新手,我对计算机和编程的结构知之甚少,所以如果我问了一些愚蠢的问题,请原谅 我必须做大量的计算,所以我想对double-for语句使用并行计算。代码如下: using Distributed @everywhere using DistributedArrays addprocs(4) function FreeSpace_2D(profile, x_prime, y_prime, d, x, y) # profile is a 2D ar

我正在寻找朱莉娅编程方面的帮助。 我是一个编程新手,我对计算机和编程的结构知之甚少,所以如果我问了一些愚蠢的问题,请原谅

我必须做大量的计算,所以我想对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 
但是代码没有初始化“数组”

当我搜索internet时,有几种方法可以使用分布式初始化一维阵列,但它们在二维阵列上不起作用


如果你能帮我,我将不胜感激

您的代码有四个问题:

  • 您需要首先
    addprocs
    ,然后调用
    @everywhere
    。否则,您的
    @everywhere
    将仅在主进程上调用
  • 您需要通过将
    @sync
    宏放在@distributed之前来同步
    @distributed
    循环,或者提供一个聚合器函数,该函数是:
    @distributed(some_func)for i in 1:1000
  • @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
查看
数组
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

非常感谢你!我测试了您的示例代码,但它产生如下错误:LoadError:TaskFailedException:在worker 15上:BoundersError:尝试访问索引[1,1]setindex处的0×0数组{Int64,2}!在.\array.jl:828。。。。。我使用的是julia 1.4.1。这段代码添加了4个进程。因此,您应该只有工人[2,3,4,5]。这意味着您已经运行了更多的
addprocs
命令。请注意,上面的
数组
仅分布在worker 2-5上(这是代码中的内容)。
@distributed
循环迭代所有可用的worker。因此,您需要:坚持使用4个工作人员,或者在所有可用的工作人员之间分配
a
,或者使用不同的机制来分配您的工作负载(使用
@spaw
将工作负载仅分配给所需的工作人员)。感谢您的详细解释。我意识到即使在程序结束后,
addprocs
仍保留进程编号。您的示例代码工作正常!然而,在我的实际代码中,当我使用您的方法对一个_local的列进行索引时,它给出了一个错误LoadError:setindex!未为DArray{Float64,2,数组{Float64,2}定义。。。虽然我准确地使用了你的索引方法,但是a_local[I,((j+66)%67)+1]。请原谅我没完没了的问题。。。在我的代码中,值类型是
Int
,并且
DArray
存储
Int
s。也许您有一些值类型不匹配?我设置了数组的类型
dzero(ComplexF64,(Nx,Ny),…)
。但是设置数组元素的函数返回
零(ComplexF64,(Nx,Ny),…)
。dzero和zero有区别吗?