是有可能,微软将能够使F#程序,无论是在虚拟机执行时间,或更可能在编译时,检测程序与功能性语言,并内置自动并行才合适呢?
现在,我相信不存在这样的努力尝试和执行时自动建立为单线程程序的多线程程序的程序。
也就是说,开发商会编写一个单线程程序。 而编译器会吐出编译的程序,它是多线程的完成需要的地方互斥和同步。
将这些优化是在这个过程中线程数的任务管理器中可见,还是会低于水平?
是有可能,微软将能够使F#程序,无论是在虚拟机执行时间,或更可能在编译时,检测程序与功能性语言,并内置自动并行才合适呢?
现在,我相信不存在这样的努力尝试和执行时自动建立为单线程程序的多线程程序的程序。
也就是说,开发商会编写一个单线程程序。 而编译器会吐出编译的程序,它是多线程的完成需要的地方互斥和同步。
将这些优化是在这个过程中线程数的任务管理器中可见,还是会低于水平?
我觉得这是不太可能在不久的将来。 如果它发生,我认为这将是更可能在IL级(汇编改写),而不是语言的水平(具体以F#/编译器如的东西)。 这是一个有趣的问题,我想到的是一些细微的头脑一直在寻找这一点,将继续寻找在这一段时间,但在短期内,我认为重点是使它更容易为人类指引线程/程序并行化,而不是仅仅把头发全都被魔术发生仿佛。
(语言功能,如F#异步工作流程 ,而像库任务并行库等 ,都是这里的近期进展很好的例子,他们可以做最繁重的工作适合你,尤其是当你的程序是不是命令式更具声明,但他们仍然需要程序员选择加入,做正确/有意义的分析,并且可能使轻微改动代码的结构,使这一切工作。)
无论如何,这是所有投机; 谁又能说什么样的未来会带来什么? 我期待着找出(希望做一些它的发生)。 :)
作为在F#是从ocaml的和ocaml的编译器派生可以优化你的程序远比其他的编译器更好,这或许可以这样做。
我不相信这是可能的一般,有用的方法和F#的函数式编程方面来autovectorize代码基本上无关紧要在这种情况下。
最困难的问题是没有检测到时,你可以并行执行subcomputations,它是确定时不会降低性能,即当子任务将采取足够长来计算,这是值得考虑平行菌种的性能损失。
我们进行了详细的科学计算的背景下研究这一点,我们已经通过了我们的F#为Numerics的库混合的方法。 我们的并行算法,根据微软的任务并行库建设,需要一个额外的参数,它给人一种子任务的估计计算复杂的功能。 这让我们的实现,以避免过多的细分,并确保最佳性能。 此外,该解决方案是理想的F#编程语言,因为描述的复杂函数参数通常是匿名一流的功能。
干杯,乔恩·哈罗普。
我认为这个问题错过了.NET architecture-- F#,C#和VB(等)的所有点被编译到IL,然后把它通过JIT编译器编译成机器代码。 一个程序是写在一个功能性的语言的事实是不relevant--如果有优化(如尾递归等)提供给从IL JIT编译器,编译器应该利用它。
当然,这并不意味着编写功能代码是irrelevant--显然,有一些方法可以写IL将并行better--但许多这些技术可以在任何.NET语言中使用。
所以,没有必要标志IL从F#来,以检查其中是否有潜在的并行,也不会这样的事情是可取的。
还有用于自动并行化和自动向量化积极研究各种语言。 人们可以期望(因为我真的很喜欢F#),他们将concive一种方法来确定是否使用了“纯”无副作用子集,然后并行化。 此外,由于西蒙·佩顿 - 琼斯哈斯克尔的父亲工作在微软我有一个很难不beliving有一些精彩的东西正在添加。
这是可能的,但可能性不大。 微软花费大部分的时间支持和实施由他们最大的客户要求的功能。 这通常意味着C#,VB.Net,和C ++(不一定按此顺序)。 似乎F#不喜欢它的高优先事项清单上。
微软目前正在开发2种途径的代码并行化:PLINQ(Pararllel LINQ的,这在很大程度上要归功于功能性语言)和任务并行库(TPL),这原本是机器人工作室的一部分。 PLINQ的一个测试,请点击这里 。
我把我的钱PLINQ成为的.NET代码自动并行化的规范。