2017-10-13 12 views
2

나는 이것이 과거에 질문되었을 수도 있지만 Julia의 절대 초보자라는 것을 알고있다.줄리아의 비동기 다중 계산을위한 병렬 코드

필자는 Julia에서 병렬로 실행하고 싶은 간단한 코드가 있습니다. 당신이 볼 수있는

#--Two Calculations during the Loop-- 

vt_0=0 
ct_0=0 

for i=1:10 

#--Calculation vt_1 
vt_1=max(rand(1:i),vt_0,ct_0) 


#--Calculation ct_1 
ct_1=min(rand(1:i),vt_0,ct_0) 

ct_0=ct_1 
vt_0=vt_1 

end 

그래서, vt_1ct_1의 계산을 동시에 수행 (또는 vt_1 계산을 기다리는 ct_1 계산을하지 않고 같은 루프 동안) 할 수있다.

아무에게도이 코드를 수정하여 병렬로 실행할 수 있습니까? 줄리아 스크립트/라이브러리를 다운로드해야합니까? (I 동적 프로그래밍에 대한 훨씬 더 크고 복잡한 코드를 가지고 있지만 본질은 동일합니다.)

실제 좋은 답변이 거기 있는지 궁금 수 있습니다 사전

+1

당신은 기본 루프 명을 병렬로 당신이 (내가 이해하는 반면 별도의 코어 루프의 각 반복을 의미 추측 할 제목을 변경할 수 있습니다) 당신이 정말로 원하는 것은 비동기 적으로 여러 표현식을 실행 한 다음 모든 답을 기다리는 것입니다. –

+0

완료. 희망은 지금 더 의미가 있습니다. – Gunnar

답변

3

이게 당신이 찾고 있는게 있니? 아마도 익명의 함수를 사용하지 않는 것이 더 빠를 것 같습니다.

addprocs(2)   
vt_0 = 0; ct_0 = 0; 
for i=1:10 
    #--Calculation vt_1 
    vt_1 = remotecall((x,y)->max(rand(1:i),x,y), 2, vt_0, ct_0) 

    #--Calculation ct_1 
    ct_1 = remotecall((x,y)->min(rand(1:i),x,y), 3, vt_0, ct_0) 

    ct_0 = fetch(ct_1) 
    vt_0 = fetch(vt_1) 
end 

또는없이 익명 funcs :

addprocs(2) 
@everywhere minrand(i,x,y) = min(rand(1:i),x,y) 
@everywhere maxrand(i,x,y) = max(rand(1:i),x,y) 
vt_0 = 0; ct_0 = 0; 

for i=1:10 
    #--Calculation vt_1 
    vt_1 = remotecall(maxrand, 2, i, vt_0, ct_0) 

    #--Calculation ct_1 
    ct_1 = remotecall(minrand, 3, i, vt_0, ct_0) 

    ct_0 = fetch(ct_1) 
    vt_0 = fetch(vt_1) 
end 
+0

정확히 내가 무엇을 찾고 있었는지! 고마워. – Gunnar

+0

안녕하세요. 필자는이 두 가지 병렬 버전 (다른 매개 변수 사용)을 시도해 왔으며 병렬로 계산하는 데 걸리는 시간이 순차적으로 훨씬 깁니다. 예를 들어 반복 횟수를 10에서 10000으로 변경하면 간단한 순차 코드에서 완료하는 데 평균 0.010 초가 걸리는 반면 병렬 코드 (실제로 두 번째 코드는 제공)에서 완료하는 데 평균 27 초가 걸리는 반면 . 내가 뭔가 잘못하고 있다고 생각하니? 아마도 나는 뭔가를 놓치고 있습니까? Jupyter Notebook을 사용하고 있습니다. 티아! – Gunnar

+0

그래서 27 초가 너무 길어서 뭔가 다른 것이있을 수 있지만 ... 다른 프로세서와 데이터를주고받는 오버 헤드 (IO 관련)가있을 수 있습니다.이 경우 다른 프로세서에서 계산을 분할하는 게인보다 중요합니다 . (각 루프에서 20 개의 표현을 분리하면 이야기가 달라질 수 있습니다). 멀티 스레딩을 시도 할 때 행운을 누릴 수도 있습니다 - 그렇지 않으면 가장 빠른 타이밍을 알려줍니다! –

2

에 감사드립니다. Julia에서 일반적으로 병렬 실행은 Base의 일부이므로 특수 라이브러리가 필요하지 않습니다. 하지만 유스 케이스의 병렬 실행은 일반적이지 않습니다. 일반적으로 병렬 for 루프는 같은 값을 다른 값으로 반복하여 호출합니다. 즉, 한 코어에서는 i = 1, 다른 코어에서는 i = 2과 관련된 표현식을 수행하고 결과를 병합합니다. 여기에 좋은 설명이 있습니다 : https://docs.julialang.org/en/latest/manual/parallel-computing/#Parallel-Map-and-Loops-1

다른 코어에서 다른 비트 (다른 ​​표현식)를 실행하는 것이 좋습니다. 편집 : 알렉산더의 응답에서 그렇게하는 방법에 대한 좋은 설명이 있습니다.

+0

내가 누락 된 것이 있습니까? 또는 내가 쓴 것은 의미가 있습니까? –

+0

AFAICS 그것은 완벽하게 이해합니다 :-) 나는 이런 식으로 일을하는 유스 케이스가 있음을 알 수 있습니다. –