数据科学爱用程序语言Julia将加入多线程平行运算功能

高端通用程序语言Julia官方宣布,在1.3.0 Alpha测试版开始加入多线程任务平行(Task Parallelism)功能,这仍是1.3.0的早期预览版本,正式版预计将会在数个月后推出。

随着软件性能提升,越来越依赖在多个处理器核心同时执行工作,官方过去为Julia添加了多程序、分布式程序开发和GPU运算功能,官方提到,他们受到英特尔TBB(Threading Building Blocks)和Go的启发,现在再次增加了多线程,为Julia程序加入全新的线程接口。

任务平行化模型可以允许多个程序平行执行,而任务将在可用的线程上同时执行所有的程序代码,官方提到,这个平行化功能运行的方式,类似垃圾回收模型,开发者可以自由地分配对象,而不需要担心这些对象在什么时候应该被释放,而任务平行化则让开发者可以自由地发布数百万个任务,而不需要担心任务在哪个线程上执行。

Julia采用的这个模型是可移植的,而且没有低端细节,开发者不需要主动启动和停止线程,甚至不需要关心系统有多少处理器和线程。除此之外,这个平行模型可支持使用嵌套结构,并且是可组合的,开发者可以调用函数库的平行任务,而这些任务还可以启动自己的平行任务。

通过多线程工作平行化功能,Julia程序可以调度许多调用函数库函数的平行任务,官方提到,这是高端语言很重要的功能,因为在高端语言程序需要经常调用函数,而Julia增加了平行运算的能力,同时也就为整个Julia组件生态系统增加了多核平行运算的能力。

目前这个多线程任务平行化功能仍有许多限制,官方提到,在实例上,每一个任务都需要有自己的执行堆栈,但这与一般Unix操作系统提供的程序与线程堆栈不同,因此Julia自己实例了一个替代切换堆栈,不过,这是需要在任务切换时,以时间来交换内存空间的折衷做法。

另外,任务现在也无法在不同线程中搬迁,官方提到,这在未来的版本会修正。而且为了避免CPU的使用率总是维持100%,因此系统会让部分任务睡眠,但当一些线程在其他线程继续睡眠的时候调度新工作,则会产生同步上的问题。

官方提到,多线程任务平行功能的发展,从Julia 0.1就开始,他们提供了对称式协作程序功能,并将其应用于事件I/O上,因此Julia程序中总会有一个并行单元运行,在2014年,官方明确的认为Julia需要基于线程的平行化功能,在开发垃圾收集器以及线程本地存储功能时,奠定了一些基础。

在2016年Julia 0.5版本提供了宏线程(Threads for Macro)功能,可以让开发者在所有核心中,简单地处理平行循环,但这个多线程有着巨大的限制,与任务和I/O系统不兼容,开发者无法线上程循环中,进行任何I/O或是在任务间切换。2016年之后官方投入更多的人力,在平行化这项功能的开发,最后花了约两年的时间,现在得以在Julia中开始真正提供多线程能力。