Multithreading 为什么Julia的去部门化受到鼓励?

Multithreading 为什么Julia的去部门化受到鼓励?,multithreading,vectorization,julia,Multithreading,Vectorization,Julia,似乎Julia鼓励编写开发代码。 甚至有一家公司试图为你做到这一点 我的问题是为什么 首先,从用户体验方面来说,矢量化代码更简洁(代码更少,出现错误的可能性更小)、更清晰(因此更容易调试)、更自然的代码编写方式(至少对于Julia试图迎合的来自科学计算背景的人来说)。能够写出像vector'vector或vector'Matrix*vector这样的东西是非常重要的,因为它对应于实际的数学表示,这是科学计算人员在头脑中(而不是在嵌套循环中)对它的看法。我讨厌这样一个事实,这不是写这个的最好方式,

似乎Julia鼓励编写开发代码。 甚至有一家公司试图为你做到这一点

我的问题是为什么

首先,从用户体验方面来说,矢量化代码更简洁(代码更少,出现错误的可能性更小)、更清晰(因此更容易调试)、更自然的代码编写方式(至少对于Julia试图迎合的来自科学计算背景的人来说)。能够写出像
vector'vector
vector'Matrix*vector
这样的东西是非常重要的,因为它对应于实际的数学表示,这是科学计算人员在头脑中(而不是在嵌套循环中)对它的看法。我讨厌这样一个事实,这不是写这个的最好方式,将它重新划分为循环会更快

目前看来,编写快速代码的目标与简洁/清晰的代码之间似乎存在冲突

第二,这方面的技术原因是什么?好的,我知道矢量化代码会创建额外的临时对象等,但是矢量化函数(例如,
broadcast()
map()
,等等)有可能对它们进行多线程处理,我认为多线程的好处可以超过临时函数的开销和向量化函数的其他缺点,使它们比常规for循环更快

Julia中向量化函数的当前实现是否在后台执行隐式多线程


如果没有,是否有工作/计划向矢量化函数添加隐式并发并使其比循环更快?

为了便于阅读,我决定将上面的注释马拉松变成一个答案

朱莉娅的背后是“我们很贪婪”。核心开发人员希望它能做任何事情,而且做得很快。特别要注意的是,该语言应该解决“两种语言问题”,在这个阶段,它看起来将在v1.0运行时完成这一任务

在你的问题的上下文中,这意味着你所问的一切要么已经是Julia的一部分,要么已经为v1.0计划好了

特别是,这意味着,如果编程问题属于矢量化代码,那么就编写矢量化代码。如果使用循环更自然,请使用循环

到v1.0的时候,大多数矢量化代码应该和Matlab中的等效代码一样快,或者更快。在许多情况下,这个开发目标已经实现,因为编译器将Julia中的许多向量/矩阵操作发送到相应的BLAS例程

关于多线程,Julia目前正在实现本机多线程,我相信master分支上已经有了一组实验性的例程。相关问题页面为。由于Julia调用BLAS,一些向量/矩阵操作的隐式多线程在理论上已经在Julia中可用。我不确定它是否默认打开

但是请注意,许多向量化操作在MATLAB中(目前)仍然会快得多,因为MATLAB多年来一直在编写专门的多线程C库,然后在幕后调用它们。一旦Julia拥有了本机多线程,我预计Julia将超越MATLAB,因为在这一点上,整个开发社区都可以搜索标准Julia包并升级它们,以尽可能利用本机多线程


相比之下,MATLAB没有本机多线程,因此您依赖Mathworks以底层C库的形式提供专门的多线程例程。

您可以而且应该编写
vector'*matrix*vector
(如果您喜欢标量输出,也可以编写
dot(vector,matrix*vector)
)。对于矩阵乘法之类的事情,最好使用向量化表示法,因为它调用底层BLAS库,这些库比基本上任何语言/编译器组合生成的代码都要优化得多

在其他地方,正如您所说,您可以通过避免临时中间产物而受益于开发:例如,如果
x
是一个向量,则表达式

y = exp(x).*x + 5
创建3个临时向量:一个用于
a=exp(x)
,一个用于
b=a.*x
,一个用于
y=b+5
。相比之下

y = [exp(z)*z+5 for z in x]
不创建临时中间产物。由于julia中的循环和理解速度很快,因此编写devectorized版本并没有缺点,事实上,它的性能应该稍好一些(特别是在适当的情况下使用性能注释,如
@simd

线程的出现可能会改变一些事情(使向量化的
exp
比“幼稚的”
exp
更快),但总的来说,我要说的是,你应该把这看作是一个“正交的”问题:julia可能会使多线程变得如此易于使用,以至于你自己可能会使用多个线程编写操作,从而实现向量化“库”例程仍然没有比您自己编写的代码更大的优势。换句话说,您可以使用多个线程,但仍然可以编写开发的代码以避免这些临时代码

从长远来看,a可能会通过自动地将这些操作中的一些进行分解来避免临时性操作,但这是一条更加困难的路线,可能会给不小心的人带来潜在的陷阱


“矢量化的代码总是更简洁,更容易理解”这句话然而,事实并非如此:很多时候,在编写Matlab代码时,你必须走极端,才能想出一种矢量化的方法来编写实际上是简单操作的循环。你可以在邮件列表中搜索无数的例子;我记得的一个是。

稳定的Julia目前在v0.4。您询问的大多数(所有?)问题都在v1.0的路线图上。所以,不要把这些文件看得太字面。如果要编写矢量化代码,请编写矢量化代码。德