2016-10-12 3 views
1

부분적으로 공유 배열 나는 일부 내 프로세스가 소유 한 공유 배열을 변경하려면 :줄리아 @parallel

julia> addprocs(4) 
4-element Array{Int64,1}: 
2 
3 
4 
5 

julia> s = SharedArray(Int, (100,), pids=[2,3]); 
julia>for i in procs() println(remotecall_fetch(localindexes, i, s)) end 
1:0 
1:50 
51:100 
1:0 
1:0 

이 작동을하지만 루프 병렬화 할 수 있도록하려면 :

julia> @parallel for i=1:100 s[i] = i end 

질문 :이 termina 않는 이유

julia> for i=1:100 s[i] = i end 

이 세그먼트 폴트와 함께 종료 프로세스 4, 5 결과 예외를 던지거나 배열을 공유하는 프로세스 사이에서만 루프를 분할하는 대신 프로세스를 수행 할 것인가?

julia> @parallel for i in localindexes(s) s[i] = i end 

각 프로세스가 로컬 인 배열의 일부를 업데이트하고, 배열이 공유되기 때문에, 변경이 :

나는이 대신 일을하지만, 전체 배열을 기입하지 않습니다 예상 하나의 프로세스가 모든 프로세스에서 볼 수 있어야합니다. 어레이의 일부가 여전히 변경되지 않은 이유는 무엇입니까?

어떻게 배열의 일부를 소유하고 프로세스가 그것을 인식하지 못할 수 있습니다 @everywhere@parallel 프로세스 2. 정의되지 s하는 오류를 제공 교체?

너무 혼란 스럽습니다. 이 루프를 병렬 처리하는 가장 좋은 방법은 무엇입니까?

+0

이 배열은 얼마나 큽니까 (이상적으로 100 개 요소 이상)? 'SharedArray' 객체는 정말 큰 데이터를 위해 설계되었습니다. 또한 최적의 성능을 위해서는 각 SharedArray 참여 프로세스가 배열 자체의 하위 집합에서만 작동해야합니다. 전체 배열을 업데이트 할 프로세서의 하위 집합 만 원한다면 먼저 마스터 프로세스가 작업하는 것보다 실제로 이것이 빠르다는 것을 확인해야합니다. 마스터 프로세스는 전체 배열을 볼 수 있으며 병렬 컴퓨팅 오버 헤드가 없기 때문에 업데이트를 병렬화하여 잠재적 인 속도 향상을 무력화 할 수 있습니다. –

+1

새로운 (곧 제공 될) 병렬 프레임 워크의 추가 일반성을 필요로하는 사람이 필요할 수 있습니다. 지금은'@ spawnat'을 사용하여 구현체를 작성할 수 있지만 그다지 매끄러운 것은 아닙니다. –

+0

어레이는 잠재적으로 예를 들어 클러스터에서 고해상도 CFD 시뮬레이션과 같이 많은 호스트에서 공유 할 수있을 정도로 커질 수 있지만, 지금 구문이 어떻게 작동 하는지를 배우려고하고 있습니다. –

답변

0

트릭이 실행됩니까?

@sync begin 
    for i in procs(s) # <-- note loop over process IDs of SharedArray s! 
     @async @spawnat i setindex!(s, i, localindexes(s)) 
    end 
end 

여기서 마스터 프로세스를 호출하면 문제가 발생할 수 있습니다. 이 경우 모델 번호가 pmap example 인 자신 만의 함수를 만들 수 있습니다.

+0

침묵이 귀청 거린다 ... :( –