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