Julia 1.5改进多线程功能正式发布稳定版API

资料科学家爱用程序语言Julia现在发布了1.5版本,经过多年发展,多线程功能终于在这个版本,从实验性功能进入稳定阶段,另外,官方还加入了新的函数库,也改进了构建系统。

官方在这个版本,进行了一项重要的优化,便是优化结构配置(Struct Layout)以及分配(Allocation),这个改进将能够极大程度降低部分工作负载的堆分配。Julia中有可变和不可变两种对象,以Struct声明的记录类型是不可变对象,当开发者想要使其转为可变,则必须使用可变结构声明,Julia会自动为每种类型选择内存配置和调用惯例。

官方解释,在这个版本之前要对不可变对象的配置进行优化,存在许多限制,因为不可变对象指向可变对象的堆分配时,那其本身就必需要进行堆分配,而在Julia 1.5之后,任意不可变对象都可以进行堆栈分配,按值传递和回传,并内联存储在数组或是其他对象中,简单来说,不可变对象参照可变值,现在变得更有效率,就像是不可变结构参照其他不可变对象一样。

之所以这项改进很重要,是因为许多重要抽象,都只能通过将可变对象打包在结构中实例,官方表示,这项优化带来的加速程度并没有很大,是因为Julia的分配器本身就非常高性能,只是让View对象不再需要堆分配。

从Julia 0.5开始,官方开始加入实验性多线程平行运算功能,到了现在1.5版,终于成为稳定功能。Julia的平行运算能力,一直是官方的重点工作之一,每个版本官方都会增加线程安全性,并且持续添加新的功能,特别是在Julia 1.3,更是线程功能的一个里程碑,加入了可组合多线程的@spawn结构。

由于目前已经有许多Julia开发人员正在使用线程功能,而且功能本身也趋于稳定,因此官方认为,已经不适合将线程功能标上实验性标签,因此将大多数线程API都标记为稳定,并使@sync和SuiteSparse绑定成为线程安全,还加入新的语法@threads。

官方为Julia编译器添加每模块优化等级功能,也就是说开发人员可以指定每个模块优化的等级,官方提到,编译时间和执行时间是一个权衡,为了让初始使用体验更好,他们默认优化等级为-O2,而这和gcc或clang中的-O2选项差不多,但因为并非所有程序代码都对性能影响很大,而且也有越来越多Julia开发者,加载较大的组件执行绘图,或是其他非内部循环支持的工作,为了减少这类组件编译延迟时间,现在开发者可以指定每个模块优化等级,像是可将Plots.jl指定为@optlevel 1,这代表该组件将使用-O1优化等级,可以减少首次搭建时间约三分之一。