2013-05-07 55 views
44

在他们arXiv paper,朱莉娅的原始作者提到以下几点:朱莉娅的并行性。功能和局限性

2.14 Parallelism。 并行执行由标准库中Julia实现的基于消息的多处理系统提供。 语言设计支持通过 提供对称协程的这种库的实现,它也可以被认为是协作调度的线程 。此功能允许在库中隐藏异步通信,而不要求 用户设置回调。 Julia目前不支持本地 线程,这是一个限制,但其优点是避免了同步使用共享内存的复杂性。

他们是怎么说朱莉娅不支持本地线程是什么意思?什么是本地线程?

其他解释语言如PythonR是否支持这种类型的并行?朱莉娅独自一人吗?

回答

60

“原生线程”是独立的执行上下文,由操作系统内核管理,访问共享内存空间并可能在不同的内核上并行执行。将其与单独的进程进行比较,这些进程可以在多个核心上同时执行,但具有单独的内存空间确保流程很好地交互很容易,因为它们只能通过内核相互通信。确保线程不以不可预知的错误方式进行交互非常困难,因为它们可以以不受限制的方式读取和写入同一内​​存。

R情况相当简单:R is not multithreaded。 Python有点复杂:Python确实支持线程,但是由于global interpreter lock (GIL),并没有实际的Python代码并发执行。其他流行的开源动态语言在本地线程方面处于各种混合状态(Ruby:no/kinda/yes?; Node.js:no),但总的来说,答案是否定的,它们不支持完全并发的本地线程,所以Julia不是独自在此。

当我们向Julia添加共享内存并行性时,as we plan to - 无论是使用本机线程还是使用共享内存的多进程 - 这将是真正的并发性,并且不会有GIL阻止同时执行Julia代码。然而,这是一种难以置信的棘手特性,可以添加到语言中,正如其他非常流行的,成熟的动态语言中不存在或有限的支持所证明的那样。添加共享内存并发模型在技术上很困难,但真正的问题在于设计一种编程模型,以便程序员能够高效安全地使用硬件并发。这个问题一般都没有解决,而且是一个非常活跃的研究和实验领域 - 没有“黄金标准”来复制。我们可以添加POSIX线程支持,但这种编程模型通常被认为是危险的,难以置信地难以正确有效地使用。 Go具有出色的并发性故事,但其设计用于编写高度并发的服务器,而不是用于同时处理大型数据,因此,简单复制Go模型对Julia来说是个好主意,这一点并不十分清楚。

+4

谢谢。当你用Python说“没有实际的Python代码的并行执行是可能的”时,你的意思是在同一个过程中,是正确的吗?根据我的理解,Python **已经**支持通过多处理包使用子进程的共享内存并行性。换句话说,当你说'当我们添加它时,它将是真正的并发性,并且不会有GIL阻止同时执行Julia代码。“',你指的是Julia用* *本地线程**,否则Julia会像Python一样实现共享内存并行。正确? – 2013-05-07 19:17:49

+4

是的,如果它在不同的进程中,那么我们就不再谈论线程了。目前还不清楚Julia中的共享内存并行性的性质是基于具有共享内存的线程或进程,并且这种区别在任何情况下都是实现细节。 Python的多处理程序包看起来确实是一种多进程共享内存并行机制,但它并不像我希望它适用于语言级原语那样方便或自然。 – StefanKarpinski 2013-05-07 21:47:51

+0

我还应该指出,像Python的多处理包这样的实验性工作已经完成:https://groups.google.com/forum/?fromgroups=#!searchin/julia-users/shmem$20mmap/julia-users/ Y_ME9uO5tVQ/HR0PPwtRIfIJ。 – StefanKarpinski 2013-05-07 21:50:30