Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parallel processing Julia:差分矩阵计算的高效并行化_Parallel Processing_Julia - Fatal编程技术网

Parallel processing Julia:差分矩阵计算的高效并行化

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的速度都

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的速度都变慢了

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()不同。