微软是否有可能在VM执行时间或更可能的是在编译时让F#程序检测到该程序是使用函数式语言构建的,并自动更好地并行化它?
现在我认为没有这样的努力尝试将以单线程程序构建的程序作为多线程程序自动执行。
也就是说,开发人员会编写一个单线程程序。然后编译器将生成一个包含互斥和同步所需内容的多线程编译程序。
这些优化是否在任务管理器中的进程线程计数中可见,还是更低级别的操作?
微软是否有可能在VM执行时间或更可能的是在编译时让F#程序检测到该程序是使用函数式语言构建的,并自动更好地并行化它?
现在我认为没有这样的努力尝试将以单线程程序构建的程序作为多线程程序自动执行。
也就是说,开发人员会编写一个单线程程序。然后编译器将生成一个包含互斥和同步所需内容的多线程编译程序。
这些优化是否在任务管理器中的进程线程计数中可见,还是更低级别的操作?
因为F#是从Ocaml演变而来的,而Ocaml编译器可以比其他编译器更好地优化您的程序,所以可能可以做到。
我不相信在一般情况下自动向量化代码是可能的,而F#的函数式编程方面在这个背景下基本上是不相关的。
最困难的问题不是检测何时可以并行执行子计算,而是确定这样做不会降低性能,即子任务将需要足够长的时间来计算,以使得并行生成的性能损失值得承受。
我们已经在科学计算的背景下对此进行了详细研究,并在我们的F# for Numerics库中采用了混合方法。我们的并行算法建立在微软的任务并行库之上,需要一个额外的参数,它是一个给出子任务的估计计算复杂度的函数。这允许我们的实现避免过度细分并确保最佳性能。此外,这种解决方案非常适合F#编程语言,因为描述复杂度的函数参数通常是匿名的一级函数。
谢谢, Jon Harrop。
目前有许多语言的自动并行化和自动向量化的研究正在进行。我们可以期望(因为我非常喜欢F#),他们会构思一种方法来确定是否使用了“纯”的无副作用子集,然后进行并行化。 此外,由于Haskell之父Simon Peyton-Jones正在微软工作,我很难不相信有一些奇妙的东西即将到来。
这是可能的,但不太可能。微软大部分时间都在支持和实现他们最大客户要求的功能。通常这意味着C#、VB.Net和C++(不一定按照这个顺序)。F#似乎不是他们优先考虑的事情。
我认为PLINQ将成为.NET代码自动并行化的标准。