2014-07-21 2 views
4

Julia 언어는 pmat() 및 @parallel과 같은 방법을 통한 병렬 처리를 지원합니다. Julia : 비평 행렬 계산의 효율적인 병렬화

는 I 데이터 세트에 대한 차이도 행렬을 계산하는 것을 시도하고있다 : 계산 독립적이므로

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 

는 I이 병렬 계산을위한 좋은 후보되어야 그림.

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이 좋지 않은 방법이라는 것을 알고 있습니다. 매우 비효율적이다.

이 방법을 사용하는 효과적인 방법이 있습니까? 나는 SharedArrays와 DistributedArrays를 시도했지만, 내가 원하는 것을 어떻게하는지 알지 못했다.

감사합니다. SharedArrays와

답변

4

그것은 매우 간단합니다 :이 코드는 내 머리에서 직선이 아닌 테스트,하지만 뭔가 myfuncmat의 지정된 인덱스에 계산을 수행

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 

있다. 그러나 combs을 직렬화하면 단일 스레드 버전보다 느리게 만들 수 있습니다. 각 프로세스에 할당 된 인덱스를 인코딩하는 훨씬 더 빠른 전략을 수립하여이를 해결할 수 있습니다 ( UnitRange{Int}으로 인코딩 할 수 있으며 을 사용하여 i,j 인덱스를 파악할 수 있음).

+0

myfunc()는 공유 배열과 (i, j) indeces 목록을 입력으로 가져와야하므로 f_dist()와 동일하지 않습니다. – Mageek