2013-05-07 42 views
44

Trong arXiv paper của họ, các tác giả ban đầu của Julia đề cập đến sau đây:Song song trong Julia. Các tính năng và hạn chế

2.14 Parallelism. Thực thi song song được cung cấp bởi hệ thống xử lý đa thông điệp được thực hiện ở Julia trong thư viện chuẩn. Thiết kế ngôn ngữ hỗ trợ việc triển khai các thư viện như vậy bằng cách cung cấp các coroutine đối xứng, cũng có thể được coi là các chuỗi được lập lịch hợp tác. Tính năng này cho phép truyền thông không đồng bộ được ẩn bên trong thư viện, thay vì yêu cầu người dùng thiết lập cuộc gọi lại. Julia hiện không hỗ trợ các chủ đề gốc , đó là một hạn chế, nhưng có lợi thế là tránh được sự phức tạp của việc sử dụng bộ nhớ chia sẻ .

Ý của chúng là gì khi nói rằng Julia không hỗ trợ chủ đề gốc? Chủ đề gốc là gì?

Làm các ngôn ngữ thông dịch khác như Python hoặc R hỗ trợ loại song song này? Julia có phải cô đơn trong chuyện này không?

Trả lời

60

"Chủ đề gốc" là ngữ cảnh thực thi riêng biệt, được quản lý bởi hạt nhân hệ điều hành, truy cập vào không gian bộ nhớ dùng chung và có khả năng thực thi đồng thời trên các lõi riêng biệt. So sánh điều này với các quy trình riêng biệt, có thể thực hiện đồng thời trên nhiều lõi nhưng có không gian bộ nhớ riêng biệt. Đảm bảo rằng các quy trình tương tác độc đáo rất dễ dàng vì chúng chỉ có thể giao tiếp với nhau thông qua hạt nhân. Đảm bảo rằng các chủ đề không tương tác với những cách không thể đoán trước được, các cách lỗi là rất khó vì chúng có thể đọc và ghi vào cùng một bộ nhớ một cách không hạn chế.

Tình huống R khá đơn giản: R is not multithreaded. Python phức tạp hơn một chút: Python hỗ trợ luồng, nhưng do global interpreter lock (GIL), không thể thực thi đồng thời mã Python một cách thực tế. Các ngôn ngữ động mã nguồn mở phổ biến khác ở các trạng thái hỗn hợp khác nhau đối với luồng gốc (Ruby: no/kinda/yes?; Node.js: no), nhưng nói chung, câu trả lời là không, chúng không hỗ trợ luồng gốc hoàn toàn đồng thời, vì vậy Julia không một mình trong này.

Khi chúng ta thêm tính song song chia sẻ bộ nhớ vào Julia, as we plan to - cho dù sử dụng chủ đề gốc hoặc nhiều quy trình với bộ nhớ dùng chung - nó sẽ là đồng thời đúng và sẽ không có GIL ngăn chặn thực thi đồng thời mã Julia. Tuy nhiên, đây là một tính năng cực kỳ khó khăn để thêm vào một ngôn ngữ, như được chứng thực bởi sự hỗ trợ không tồn tại hoặc hạn chế trong các ngôn ngữ động rất phổ biến, rất phổ biến khác. Việc thêm một mô hình đồng thời chia sẻ bộ nhớ là khó khăn về mặt kỹ thuật, nhưng vấn đề thực sự là thiết kế một mô hình lập trình sẽ cho phép các lập trình viên sử dụng hiệu quả phần cứng đồng thời một cách hiệu quả và an toàn. Vấn đề này nói chung là chưa được giải quyết và là một lĩnh vực rất tích cực của nghiên cứu và thử nghiệm - không có "tiêu chuẩn vàng" để sao chép. Chúng tôi chỉ có thể thêm hỗ trợ chủ đề POSIX, nhưng mô hình lập trình đó thường được coi là nguy hiểm và cực kỳ khó sử dụng một cách chính xác và hiệu quả. Go có một câu chuyện đồng thời tuyệt vời, nhưng nó được thiết kế để viết các máy chủ đồng thời cao, không cho đồng thời hoạt động trên dữ liệu lớn, vì vậy không rõ ràng là chỉ cần sao chép mô hình của Go là một ý tưởng hay cho Julia.

+4

Cảm ơn. Khi bạn nói rằng với Python "" không có thực thi đồng thời thực tế của mã Python là có thể "', bạn có nghĩa là trong cùng một quá trình, chính xác?Từ những gì tôi hiểu Python ** đã ** hỗ trợ song song chia sẻ bộ nhớ bằng cách sử dụng các quy trình con thông qua gói đa xử lý. Nói cách khác, khi bạn nói '" Khi chúng ta thêm [...] nó sẽ là đồng thời đúng và sẽ không có GIL ngăn cản việc thực hiện đồng thời mã Julia. "', Bạn đang đề cập đến kịch bản mà Julia thực hiện điều này với * * các luồng gốc **, nếu không Julia sẽ thực hiện song song bộ nhớ chia sẻ như Python. Chính xác? –

+4

Có, nếu nó nằm trong các quy trình riêng biệt, thì chúng ta không nói về luồng nữa. Hiện tại chưa rõ liệu bản chất của sự tương đương bộ nhớ chia sẻ trong Julia sẽ dựa trên các luồng hay các tiến trình với bộ nhớ chia sẻ, và sự phân biệt đó là một chi tiết thực hiện trong mọi trường hợp. Gói đa xử lý của Python dường như làm một hình thức song song chia sẻ bộ nhớ đa tiến trình, nhưng nó không thuận tiện hay tự nhiên như tôi muốn nó dành cho một nguyên thủy cấp độ ngôn ngữ. – StefanKarpinski

+0

Tôi cũng nên chỉ ra rằng thử nghiệm làm việc trên một cái gì đó giống như gói đa xử lý của Python đã được thực hiện: https://groups.google.com/forum/?fromgroups=#!searchin/julia-users/shmem$20mmap/julia-users/ Y_ME9uO5tVQ/HR0PPwtRIfIJ. – StefanKarpinski