未来F#是否可能比其他.NET语言更优化?

14

微软是否有可能在VM执行时间或更可能的是在编译时让F#程序检测到该程序是使用函数式语言构建的,并自动更好地并行化它?

现在我认为没有这样的努力尝试将以单线程程序构建的程序作为多线程程序自动执行。

也就是说,开发人员会编写一个单线程程序。然后编译器将生成一个包含互斥和同步所需内容的多线程编译程序。

这些优化是否在任务管理器中的进程线程计数中可见,还是更低级别的操作?

7个回答

13
我认为这在不久的将来是不太可能的。即使发生了,我认为它更可能出现在IL级别(汇编重写)而不是语言级别(例如特定于F#/编译器的内容)。 这是一个有趣的问题,我相信一些聪明的人已经在研究这个问题,并将继续研究一段时间,但在短期内,我认为重点将放在使人类更容易地指导程序的线程/并行化,而不仅仅是让它像魔术一样自动发生。
(像F# async workflows这样的语言特性和task-parallel library和其他库等都是近期进展的好例子;它们可以为您完成大部分繁重的工作,特别是当您的程序更具声明性而不是命令性时,但它们仍需要程序员选择加入,进行正确性/意义分析,并可能对代码结构进行轻微修改以使其正常工作。)
无论如何,这都是猜测;谁能说未来会带来什么? 我期待着发现(并希望实现其中的一些)。 :)

2
PLINQ被开发的原因之一是为了消除开发人员执行“正确性/意义分析”的需要。 - Mitch Wheat

7

因为F#是从Ocaml演变而来的,而Ocaml编译器可以比其他编译器更好地优化您的程序,所以可能可以做到。


6

我不相信在一般情况下自动向量化代码是可能的,而F#的函数式编程方面在这个背景下基本上是不相关的。

最困难的问题不是检测何时可以并行执行子计算,而是确定这样做不会降低性能,即子任务将需要足够长的时间来计算,以使得并行生成的性能损失值得承受。

我们已经在科学计算的背景下对此进行了详细研究,并在我们的F# for Numerics库中采用了混合方法。我们的并行算法建立在微软的任务并行库之上,需要一个额外的参数,它是一个给出子任务的估计计算复杂度的函数。这允许我们的实现避免过度细分并确保最佳性能。此外,这种解决方案非常适合F#编程语言,因为描述复杂度的函数参数通常是匿名的一级函数。

谢谢, Jon Harrop。


4
我认为这个问题忽略了.NET架构的要点 - F#,C#和VB(等)都会被编译成IL,然后通过JIT编译器将其编译成机器码。程序是用函数式语言编写的事实并不重要 - 如果JIT编译器从IL中获得了优化(例如尾递归等),编译器应该利用它。显然,这并不意味着编写函数式代码无关紧要 - 显然,有些方法可以编写更好地并行化的IL - 但是许多这些技术可以在任何.NET语言中使用。因此,没有必要将IL标记为来自F#,以便检查其潜在的并行性,也不应该这样做。

1
函数式编程可以更好地拆分任务并并发执行。当然,有人正在研究这个领域,而且这是很有吸引力的。 - Brian R. Bondy
我觉得你没理解我的意思。F#(以及其他函数式语言)使你能够以更好的方式编写代码,从而更容易进行并行化。这是非常可取的。然而,这些优势只会在IL中体现出来,如果有人用C#编写符合相同模式的代码,也同样会在IL中显现出来。 - Michael Dorfman
一旦进入IL,我同意你无法做太多事情。但在进入IL之前,可以进行优化。 - Brian R. Bondy
即使是像函数结果的隐式缓存这样的优化,也可以在像F#这样的语言中完成,但在C#中则不行。 - Brian R. Bondy
当然可以。但是你可以在C#中显式缓存,对于IL而言,这并没有什么区别。重新阅读原始问题。使用标记将IL标记为来自F#的代码不会帮助JIT“自动并行化”它。 - Michael Dorfman

3

目前有许多语言的自动并行化和自动向量化的研究正在进行。我们可以期望(因为我非常喜欢F#),他们会构思一种方法来确定是否使用了“纯”的无副作用子集,然后进行并行化。 此外,由于Haskell之父Simon Peyton-Jones正在微软工作,我很难不相信有一些奇妙的东西即将到来。


2

这是可能的,但不太可能。微软大部分时间都在支持和实现他们最大客户要求的功能。通常这意味着C#、VB.Net和C++(不一定按照这个顺序)。F#似乎不是他们优先考虑的事情。


我个人喜欢 F#,因为它是一种优雅的编写算法的方式,可以用几行 F# 代码代替 C# 中的多行代码。 - user4649737

2
微软目前正在开发2种并行化代码的途径:PLINQ(Parallel Linq,它借鉴了函数式语言)和任务并行库(TPL),它最初是机器人工作室的一部分。 PLINQ的测试版可以在此处下载。

我认为PLINQ将成为.NET代码自动并行化的标准。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接