2015-06-23 27 views
7

Tôi đang chuẩn bị một bài thuyết trình nhỏ trong Ipython, nơi tôi muốn cho thấy việc thực hiện song song dễ dàng như thế nào ở Julia.Julia tính toán song song trong IPython Jupyter

Đó là cơ bản một tính toán Monte Carlo Pi described here

Vấn đề là tôi không thể làm cho nó hoạt song song bên trong một IPython (Jupyter) Máy tính xách tay, nó chỉ sử dụng một.

tôi bắt đầu Julia như: julia -p 4

Nếu tôi xác định các chức năng bên trong REPL và chạy nó ở đó nó hoạt động ok.

@everywhere function compute_pi(N::Int) 
    """ 
    Compute pi with a Monte Carlo simulation of N darts thrown in [-1,1]^2 
    Returns estimate of pi 
    """ 
    n_landed_in_circle = 0 
    for i = 1:N 
     x = rand() * 2 - 1 # uniformly distributed number on x-axis 
     y = rand() * 2 - 1 # uniformly distributed number on y-axis 

     r2 = x*x + y*y # radius squared, in radial coordinates 
     if r2 < 1.0 
      n_landed_in_circle += 1 
     end 
    end 
    return n_landed_in_circle/N * 4.0  
end 

function parallel_pi_computation(N::Int; ncores::Int=4) 
    """ 
    Compute pi in parallel, over ncores cores, with a Monte Carlo simulation throwing N total darts 
    """ 
    # compute sum of pi's estimated among all cores in parallel 
    sum_of_pis = @parallel (+) for i=1:ncores 
     compute_pi(int(N/ncores)) 
    end 

    return sum_of_pis/ncores # average value 
end 

julia> @time parallel_pi_computation(int(1e9)) 
elapsed time: 2.702617652 seconds (93400 bytes allocated) 
3.1416044160000003 

Nhưng khi tôi làm:

using IJulia 
notebook() 

Và cố gắng làm điều tương tự bên trong Máy tính xách tay nó chỉ sử dụng 1 lõi:

In [5]: @time parallel_pi_computation(int(10e8)) 
elapsed time: 10.277870808 seconds (219188 bytes allocated) 

Out[5]: 3.141679988 

Vì vậy, tại sao Jntyter không sử dụng tất cả các lõi? Tôi có thể làm gì để nó hoạt động?

Cảm ơn.

+0

Bạn đã thử sửa đổi tệp 'kernel.json' tương ứng và thêm công tắc' -p' vào đó chưa? – cel

+1

Điều gì xảy ra nếu 'addprocs (4)' được phát hành đầu tiên trong sổ ghi chép? – rickhg12hs

+0

@ rickhg12hs, tôi nghĩ rằng điều này sẽ làm việc và nếu như vậy đây là một giải pháp đẹp hơn nhiều so với tập tin hạt nhân xấu xí của tôi hack. – cel

Trả lời

10

Sử dụng addprocs(4) làm lệnh đầu tiên trong sổ ghi chép của bạn sẽ cung cấp bốn công nhân để thực hiện các thao tác song song từ bên trong sổ ghi chép của bạn.

3

Một cách để giải quyết điều này là tạo hạt nhân luôn sử dụng 4 lõi. Đối với một số công việc thủ công là bắt buộc. Tôi cho rằng bạn đang ở trên một máy unix.

Trong thư mục ~/.ipython/kernels/julia-0.x, bạn sẽ tìm thấy sau kernel.json file:

{ 
    "display_name": "Julia 0.3.9", 
    "argv": [ 
    "/usr/local/Cellar/julia/0.3.9_1/bin/julia", 
    "-i", 
    "-F", 
    "/Users/ch/.julia/v0.3/IJulia/src/kernel.jl", 
    "{connection_file}" 
    ], 
    "language": "julia" 
} 

Nếu bạn sao chép toàn bộ thư mục cp -r julia-0.x julia-0.x-p4, và sửa đổi vừa được sao chép kernel.json file:

{ 
    "display_name": "Julia 0.3.9 p4", 
    "argv": [ 
    "/usr/local/Cellar/julia/0.3.9_1/bin/julia", 
    "-p", 
    "4", 
    "-i", 
    "-F", 
    "/Users/ch/.julia/v0.3/IJulia/src/kernel.jl", 
    "{connection_file}" 
    ], 
    "language": "julia" 
} 

Các đường dẫn có thể sẽ khác nhau cho bạn. Lưu ý rằng tôi chỉ đặt cho hạt nhân tên mới và thêm đối số dòng lệnh `-p 4.

Bạn sẽ thấy hạt nhân mới có tên Julia 0.3.9 p4 nên luôn sử dụng 4 lõi.

Cũng lưu ý rằng tệp hạt nhân này sẽ không được cập nhật khi bạn cập nhật IJulia, vì vậy bạn phải cập nhật nó theo cách thủ công bất cứ khi nào bạn cập nhật julia hoặc IJulia.

+0

Cảm ơn bạn đã trả lời. Tôi đã không thử điều này, nhưng tôi nghĩ rằng điều này có thể làm việc cho một giải pháp lâu dài hơn. @ rickhg12hs giải pháp làm việc tốt cho bây giờ. – Esteban

+0

Khi tôi đã ở trong một phiên Julia trên Jupyter ... Có lệnh nào có thể cho tôi biết có bao nhiêu tiến trình đã được kích hoạt không? – skan

+1

@skan có hàm 'procs()' trả về các id của tất cả các quy trình. Nếu bạn gọi nó sau khi bắt đầu julia với '-p 4', bạn sẽ nhận được một mảng có chiều dài 5: Một là tiến trình chính và bốn số còn lại là các công nhân được yêu cầu bởi' -p'. – cel

Các vấn đề liên quan