65.9K
CodeProject 正在变化。 阅读更多。
Home

Julia:高性能计算的高级语言

starIconstarIconemptyStarIconemptyStarIconemptyStarIcon

2.00/5 (1投票)

2017年8月31日

CPOL

7分钟阅读

viewsIcon

20686

JuliaProject 在科学计算领域不断突破新界限

下载 Intel® 数学核心库

Ranjan Anantharaman, Viral Shah, and Alan Edelman, Julia Computing

高性能计算(HPC)一直是科学发现的前沿。科学家们经常在分布式环境中运行数百万核的模拟。涉及的关键软件堆栈通常是静态编译语言,如 C/C++ 或 Fortran,与 OpenMP*/MPI* 结合使用。这个软件堆栈经受住了时间的考验,在 HPC 世界中几乎无处不在。其主要原因是它在利用所有可用计算资源的同时限制内存使用方面的效率。这种效率水平一直超出了 Python*、Octave* 或 R* 等更“高级”脚本语言的范畴。这主要是因为这些语言被设计为高生产力环境,以促进快速原型设计,而不是设计用于在大型计算集群上高效运行。然而,从技术上讲,并没有理由必须如此,这代表了科学计算的一个工具问题。

Julia,一门用于技术计算的新语言,旨在解决这个问题。它的语法类似于 Python 或 Octave,但性能与 C 相当。它内置了多线程和分布式计算的原语,使应用程序能够扩展到数百万个核心。

最自然的问题是:为什么其他高级语言无法达到这种性能?Julia 有什么独特之处,能够达到这种效率水平,同时又能让用户编写可读的代码?

答案是,Julia 结合了类型推断和代码专门化来生成紧凑的机器码。为了说明这一点,我们使用 Julia 宏 @code_native,它可以生成函数调用时产生的汇编代码。例如:

julia> @code_native 1 + 1
	.section	__TEXT,__text,regular,pure_instructions
Filename: int.jl
	pushq	%rbp
	movq	%rsp, %rbp
Source line: 32
	leaq	(%rdi,%rsi), %rax
	popq	%rbp
	retq
Source line: 32
	nopw	(%rax,%rax)

这个例子显示了 Julia 相加两个整数时生成的汇编代码。请注意,Julia 为操作选择了正确的汇编指令,并且几乎没有开销。

下一个代码片段显示了两个双精度浮点数的相加

julia> @code_native 1. + 1.
	.section	__TEXT,__text,regular,pure_instructions
Filename: float.jl
	pushq	%rbp
	movq	%rsp, %rbp
Source line: 240
	addsd	%xmm1, %xmm0
	popq	%rbp
	retq
Source line: 240
	nopw	(%rax,%rax)

Julia 自动选择了一个不同的指令 `addsd`,因为我们现在是在相加两个浮点数。这是因为函数“+”会根据输入的类型生成两个版本,这些类型是由编译器推断出来的。这个想法允许用户编写高级代码,然后让 Julia 推断输入和输出的类型,并随后为这些输入类型编译该函数的专门化版本。这就是 Julia 速度快的原因(图 1)。

图 1:Julia 的基准测试时间与 C 的比较(数字越小越好)。C 性能 = 1.0。基准测试代码可以在GitHub 仓库中找到。

Julia 的独特功能解决了数据科学和数值计算中的两语言问题。这导致 Julia 在各行业的需求,从航空航天金融

这促成了 Julia Computing 的成立,该公司为行业提供咨询,并促进 Julia 在社区中的普及。Julia Computing 的旗舰产品之一是 JuliaPro*,这是一个 Julia 发行版,包含一个 IDE、一个调试器以及 100 多个经过测试的包。JuliaPro 即将支持 Intel® 数学核心库 (Intel® MKL),用于加速 BLAS 操作和针对多核及最新 Intel® 处理器的优化。

Julia 中的并行计算

Julia 在各个级别都提供了多种内置的并行计算原语:向量化(SIMD)、多线程和分布式计算。

以一个极易并行化的模拟为例。计算 π 的迭代过程包括生成 0 到 1 之间的随机数,并最终计算“落在”单位圆内的点数与未落在单位圆内的点数之比。这给出了单位正方形和单位圆面积之比,然后可以用来计算 π。下面的 Julia 代码使用了 @parallel 构造。规约操作符“+”对在所有 Julia 进程上并行计算的最终表达式的值进行求和。

addprocs(2)   # Add 2 Julia worker processes

function parallel_π(n)
    in_circle = @parallel (+) for i in 1:n   # <-- partition the work
        x = rand()
        y = rand()
        Int((x^2 + y^2) < 1.0)
    end
    return (in_circle/n) * 4.0
end

parallel_π(10000)

Julia 将工作卸载到其工作进程,这些进程计算所需的结果并将它们发送回 Julia 主进程,在那里进行规约。通过这种单边通信模型,任意计算片段都可以分配给不同的工作进程。

一个更有趣的用例是让不同的进程解决,例如,线性方程组,然后将它们的输出序列化并发送到主进程。可扩展的机器学习就是一个涉及许多独立反解的例子。图 2 显示了 RecSys.jl 的性能,它处理数百万条电影评分以进行预测。它基于一种称为交替最小二乘法(ALS)的算法,这是一种用于协同过滤的简单迭代方法。由于每个求解都独立于其他求解,因此该代码可以轻松并行化和扩展。图 2 是一个性能图表,显示了该系统的扩展特性。

图 2. ALS 推荐系统的扩展图:“nprocs”指共享内存和分布式环境中的工作进程数量,以及多线程环境中的线程数量。

在图 2 中,我们考察了 Julia 在多线程模式(Julia MT)、分布式模式(Julia Distr)和共享内存模式(Julia Shared)下的扩展性能。共享内存模式允许独立的 Julia 工作进程(而不是线程)访问共享地址空间。该图表的一个有趣之处在于比较了 Julia 的分布式能力与 Apache Spark* 的能力,Apache Spark* 是一个广泛应用于工业界的流行的可扩展分析框架。更有趣的是本次实验的结果:Julia 可以很好地扩展到更多的节点。现在让我们转向一个真实的超级计算实验。

整合所有(大规模):Celeste*

Celeste* 项目是 Julia Computing (Keno Fischer)、Intel Labs (Kiran Pamnany)、JuliaLabs@MIT (Andreas Noack, Jarrett Revels)、Lawrence Berkeley National Labs (David Schlegel, Rollin Thomas, Prabhat) 和加州大学伯克利分校 (Jeffrey Regier, Maximilian Lam, Steve Howard, Ryan Giordano, Jon McAuliffe) 的合作项目。Celeste 是一个完全生成式的分层模型,它使用统计推断在数学上定位和表征天空中的光源。该模型使天文学家能够识别有希望的星系进行光谱仪定位,定义需要进一步探索的星系,并帮助理解暗能量、暗物质和宇宙的几何结构。用于该实验的数据集是 Sloan Digital Sky Survey (SDSS)(图 3),包含超过 500 万张图像,共计 55TB 数据。

图 3:Sloan Digital Sky Survey (SDSS) 的一个样本

利用 Julia 原生的并行计算能力,研究人员能够将他们的应用程序扩展到 LBNL 的 NERSC Cori* 超级计算机上的 8,192 个 Intel® Xeon® 处理器核心。这使得图像分析的并行加速达到 225 倍,处理了超过 20,000 张图像(或 250 GB),与之前的迭代相比提高了三个数量级。

请注意,这是通过 Julia 的原生并行功能实现的,该功能支持高达 256 个节点和每个节点 4 个线程的扩展。这种级别的扩展使 Julia firmly 跻身 HPC 领域,与 C/C++ 和 Fortran 等语言并驾齐驱。

Intel Labs 的 Pradeep Dubey 总结得很好:“通过 Celeste,我们更接近于让 Julia 参与讨论,因为我们已经证明了混合并行(不仅是进程,还有线程)的出色效率——这是 Python 或 R 仍然无法做到的。”

该项目的下一步是进一步扩展并处理整个数据集。这将需要利用最新的 Intel® Xeon Phi™ 处理器和协处理器。

打破新边界

自 2012 年成立以来,Julia 项目已经取得了长足的进步,在科学计算领域不断突破界限。Julia 的设计初衷是成为一种既能保留 Python 的生产力,又能达到 C/C++ 的速度和可扩展性的语言。Celeste 项目表明,这种方法使 Julia 成为第一个能够很好地在集群上扩展的高生产力语言。

Julia 项目的用户群每年都在翻倍,并在各种行业中得到越来越多的采用。计算科学的这些工具进步不仅对解决未来时代挑战的科学研究有利,还将带来快速的创新周期和行业周转时间。

了解更多

Julia Computing

© . All rights reserved.