2017-11-29 9 views
0

나는 @parallel for 매크로를 사용하여 다양한 매개 변수에 대한 시뮬레이션을 실행합니다. 각 런은 1 차원 벡터를 생성합니다. 결국 나는 DataFrame에 결과를 수집하고 싶습니다.remotecall을 통해 @parallel for-loop의 결과 수집

지금까지 항상 중간 배열을 생성하고 for 루프를 vcat으로 줄였습니다. 다음 DataFrame을 건설했다. 나는 remotecall을 통해 마스터 프로세스에 대한 각 계산의 결과가 push! 일 수도 있다고 생각했습니다. 최소한의 예

X=Float64[] 

@sync @parallel for i in linspace(1.,10.,10) 
     remotecall_fetch(()->push!(X,i),1) 
     end 

같은 일관되지 9 개 10 요소 어레이 X되는 결과를 보일 것이다. 삭제 된 요소의 수는 더 많은 작업자가 추가 될수록 커집니다.

이것은 julia-0.6.1입니다.

나는 줄리아의 병렬 컴퓨팅 구조를 이해했다고 생각했지만 그렇지 않은 것 같습니다.

이 동작의 이유는 무엇입니까? 어떻게하면 더 좋고 안전하게 할 수 있습니까?

답변

0

어디서나 말할 수는 없지만 경쟁 조건을 유발하고있는 것으로 판단됩니다. 만 반복 당 하나의 값을 돌려 줄 필요가있는 경우

, 난 그냥 pmap를 사용하는 것이 좋습니다 것입니다 :

pmap(linspace(1.,10.,10)) do i 
    i 
end 

그렇지 않으면 각 반복 여러 값을 반환 할 수 있다면, 그것은 아마도 가장 RemoteChannels를 사용하는 것입니다.