2017-11-24 2 views
1

N 난수를 생성하고 배열에 저장하는 기본 반복을 고려 (우리가 배열 함축에 관심이없는 하나 있다고 가정하고 또한 우리가 모르는 호출 rand(N))병렬 임의의 숫자 줄리아

function random_numbers(N::Int) 
array = zeros(N) 
for i in 1:N 
    array[i] = rand() 
end 
array 
end 

내 노트북의 코어를 활용하여 동일한 어레이를 생성하는 비슷한 기능에 관심이 있습니다. this nice blog에서 매크로 @everywhere, @spawn@parallel이 도입되었지만 "즉시"계산이 수행되고 데이터를 저장하는 데 어레이가 필요하지 않습니다.

나는 이것이 매우 기본적이고 쉽게 함수 pmap을 사용하여 쉽게 수행 할 수 있다는 인상을 받았지만 병렬 컴퓨팅에 익숙하지 않습니다.

제 목표는 비정상적인 분포에서 추출한 난수를 생성하기 위해 만든 함수에이 방법을 적용하는 것입니다.

+0

그럼 사실로 돌아가 봅시다. ** [1] ** 지금까지 어떤 시도를 했습니까? ** [2] ** 수집 된 결과는 어디에 있습니까? ** [3] ** 수집 된 결과에서 누락 된 부분은 이전 기대치 중 일부 집합과 후자와 더 잘 일치하려는 시도에서 무엇을 테스트 했습니까? 이러한 사실과 정량을 게시하는 데있어서 분명히 밝혀야합니다. 분명히 커뮤니티 회원 * (cit.)에 "*** 아이디어가 있습니까? ***"라고 외칠 것입니다. 이것은 궁극적으로 무례한 것입니까? – user3666197

+2

'result = @parallel (vcat) for i in 1 : ncores random_numbers (N) end'? – Liso

답변

2

의견에 제안 된대로 더 명확한 질문에 항상 환영합니다. 그러나, 그것은 무엇이 필요한지 pmap 것 같습니다. 관련 문서는 here입니다.

다음은 예입니다. 참고로, pmap 메서드에서 보낸 시간은 일반 map의 절반입니다. 16 개 코어, 상황이 실질적으로 개선 될 수 있습니다

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

julia> @everywhere long_rand() = foldl(+,0,(randn() for i=1:10_000_000)) 

julia> long_rand() 
-1165.9596619177153 

julia> @time map(x->long_rand(), zeros(10,10)) 
    8.455930 seconds (204.89 k allocations: 11.069 MiB) 
10×10 Array{Float64,2}: 
    ⋮ 
    ⋮ 

julia> @time pmap(x->long_rand(), zeros(10,10)); 
    6.125479 seconds (773.08 k allocations: 42.242 MiB, 0.25% gc time) 

julia> @time pmap(x->long_rand(), zeros(10,10)) 
    4.609745 seconds (20.99 k allocations: 954.991 KiB) 
10×10 Array{Float64,2}: 
    ⋮ 
    ⋮ 
+0

'long_rand()'함수의 정의에 대해 더 자세히 설명해 주시겠습니까? 그래서'addprocs' 함수에서 코어 수를 넘깁니다. 맞습니까? @Liso 코멘트에 대해 어떻게 생각하세요? 이것은 원래의 목표를 달성하지만 나는 당신이 해결책을 제시하는 이런 식으로 매우 흥미 롭습니다. – dapias

+1

첫 번째로, Liso comment는 똑같이하는 또 다른 방법을 설명합니다 - 아주 비슷합니다. 'long_rand'의 정의는 당신이하고자하는 복잡한 계산을위한 자리 표시 자 (placeholder)로 사용되는 무작위 값 (임의의 정규 변수를 많이 추가함으로써)을 낭비 적으로 계산하는 것입니다. –

+1

@dapias'addprocs'를하면'ncores = length (procs())'는 실제 작업자 프로세스 수를 알려줍니다. (rmprocs도 참조하십시오.) @DanGetz 아직 초보자이며 pmap 성능에 깊은 인상을 받았습니다! :) 4 개의 작업자 프로세스로 1 : 3 맵 (x-> long_rand(), 0 (10)) 끝에서 i에 대해 @time @parallel (hcat)을 테스트했습니다. 할당 속도는 느리지 만'@time pmap (x-> long_rand(), 0 (10,3))'보다 느립니다.그리고 long_rand를 rand로 변경하면 (약 40,000 배 느린) 솔루션은지도 함수에 비해 빠릅니다! :) – Liso

2

내가 예를 들어, 병렬 프로세스에서 난수 생성기의 더 조심 초기화를 수행하는 것이 좋습니다 : 이런 식으로

# choose the seed you want 
@everywhere srand(1) 
# replace 10 below by maximum process id in your case 
@everywhere const LOCAL_R = randjump(Base.GLOBAL_RNG, 10)[myid()] 
# here is an example usage 
@everywhere f() = rand(LOCAL_R) 

당신 :

  • 결과를 재현 할 수 있는지 확인하십시오.
  • 은 서로 다른 프로세스에 의해 생성 된 임의의 시퀀스간에 겹침이 없다는 제어권을가집니다.
+1

DanGetz 대답에서'@everywhere long_rand() = foldl (+, 0, (randn (LOCAL_R) for i = 1 : 10_000_000))'이라고 쓰면 대답은 다른 것이 아닙니다. –