Parallel processing Julia:差分矩阵计算的高效并行化
Julia语言通过pmat()和@parallel等方法支持并行化 我试图为一组数据计算相异矩阵:Parallel processing Julia:差分矩阵计算的高效并行化,parallel-processing,julia,Parallel Processing,Julia,Julia语言通过pmat()和@parallel等方法支持并行化 我试图为一组数据计算相异矩阵: n = length(dataset) mat = zeros(n,n) for i = 1 : n for j = i+1 : n mat[i,j] = mat[j,i] = f_dist(dataset[i], dataset[j]) end end 由于计算是独立的,我认为这应该是并行计算的一个很好的候选者 我尝试使用pmat()和@parallel的速度都
n = length(dataset)
mat = zeros(n,n)
for i = 1 : n
for j = i+1 : n
mat[i,j] = mat[j,i] = f_dist(dataset[i], dataset[j])
end
end
由于计算是独立的,我认为这应该是并行计算的一个很好的候选者
我尝试使用pmat()和@parallel的速度都变慢了
mat = @parallel (+) for comb in collect(combinations([1:n],2))
submat = zeros(n,n)
i = comb[1]
j = comb[2]
dist = f_dist(dataset[i],dataset[j])
submat[i,j] = dist
submat[j,i] = dist
submat
end
我知道@parallel是一种糟糕的方式,因为我本质上是在创建一组稀疏矩阵并将它们相加。效率很低
有没有一种有效的方法让它发挥作用?我试过ShareDarray和DistributedArray,但还没有找到我想要的方法
谢谢。使用SharedArrays,它应该相当简单:这段代码是我直接想到的,没有经过测试,但类似于
mat = SharedArray(Float64, n, n)
combs = collect(combinations([1:n],2))
chunkbreaks = linspace(0, length(combs), nworkers()+1)
@sync begin
for (i,wpid) in enumerate(workers())
@async begin
remotecall_wait(wpid, myfunc, mat, combs[chunkbreaks[i]+1:chunkbreaks[i+1]])
end
end
end
其中,myfunc
对mat
的指定索引执行计算
但是,我应该补充一点,除非相异性计算速度慢,否则序列化
combs
可能会使其比单线程版本慢。您可以通过提出一种更快的策略来对分配给每个进程的索引进行编码来解决这个问题(它可以通过一个UnitRange{Int}
进行编码,并使用divrem
计算i,j
索引)。需要注意的一点是myfunc()必须获取共享数组和(i,j)列表索引作为输入,因此它与f_dist()不同。