我正在寻求有关 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
查看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