F#是否为您提供自动并行?

F#是否为您提供自动并行?,f#,parallel-processing,F#,Parallel Processing,我的意思是:当你设计你的应用程序时,没有副作用等,F代码会自动分布到所有核心吗?不会。您仍然必须通过F#支持的许多机制之一显式封送对其他线程的调用。不,我很确定它不会自动为您并行化。它必须知道你的代码没有副作用,这可能很难证明,一方面 当然,F#可以使代码更容易并行化,特别是在没有任何副作用的情况下。。。但那是另一回事。我的理解是,它只能让F#消费。这不会使它自动多线程,应该使它很容易实现。与前面提到的其他方法一样,F#不会自动跨内核扩展,并且仍然需要一个框架,如Josh提到的ParallelF

我的意思是:当你设计你的应用程序时,没有副作用等,F代码会自动分布到所有核心吗?

不会。您仍然必须通过F#支持的许多机制之一显式封送对其他线程的调用。

不,我很确定它不会自动为您并行化。它必须知道你的代码没有副作用,这可能很难证明,一方面


当然,F#可以使代码更容易并行化,特别是在没有任何副作用的情况下。。。但那是另一回事。

我的理解是,它只能让F#消费。这不会使它自动多线程,应该使它很容易实现。

与前面提到的其他方法一样,F#不会自动跨内核扩展,并且仍然需要一个框架,如Josh提到的ParallelFX端口


F#通常与并行处理的潜力有关,因为它默认为对象是不可变的,在许多情况下不需要锁定。

不,恐怕不是。考虑到F#不是一种纯粹的函数式语言(从最严格的意义上讲),我认为这样做相当困难。在F#中充分利用并行性的主要方法是使用异步工作流(我认为主要是通过异步模块)。随着.NET4.0的推出,TPL(Task Parallel Library)将在F#中扮演类似的角色(尽管值得注意的是,它可以在所有.NET语言中同样出色地使用),尽管我不能确切地说它将如何与现有的异步框架集成。也许微软会简单地建议在所有事情上都使用第三方物流,或者他们会将两者都作为一种选择,而其中一种最终将成为事实上的标准

无论如何,这里有几篇关于F#中异步编程/工作流的文章,让您开始学习


    • 好吧,你有你的答案,但我只想补充一点,我认为这是F#最重要的限制,因为它是一种混合命令式/函数式语言

      我希望看到对F#的一些扩展,它将函数声明为纯函数。也就是说,它没有函数类型未表示的副作用。其思想是,只有当函数引用其他“已知纯”函数时,它才是纯函数。当然,只有当可以要求作为函数参数传递的委托引用纯函数时,这才有用。

      F#并没有使其自动,只是使其更容易

      还有一个链接到的机会。从52:20开始的八分钟是F#async工作流的精彩演示。石头

      关于纯度注释:具有纯属性。我记得听说BCL的某些部分已经使用了这个。这个属性也可能被并行化框架使用,但我目前还不知道有这样的工作。此外,我甚至不确定F#中的代码联系人的可用性如何,因此这里有很多未知数


      不过,看看这些东西是如何结合在一起的还是很有趣的。

      F的类型系统不区分纯函数和非纯函数吗?所以知道手术没有副作用应该不难。谢谢Jon。证明你的意思是,你必须使用合同之类的东西?我不知道这种区别,但要说它不存在还有很长的路要走。不过,这可能会切断与框架的任何交互——那么例外情况呢?@Joan:我是说,对于它来说,能够自动并行将是非常困难的,而且可能在许多情况下都不会像使用有用的库和语言功能进行仔细的手动并行化那样有帮助,以使其更容易。伙计们,在这种情况下,纯度是一个危险因素。在并行环境中,跟踪类型系统中的副作用基本上是无用的。即使两个表达式在概念上可以并行计算,这样做通常也会严重降低性能,因为它们会争夺诸如主内存之类的共享资源。解决这个问题需要对算法进行理论研究,这就是为什么自动并行化在一般情况下永远不会非常有用的原因…好的捕获Richard…在低睡眠状态下运行简直不敢相信我写了这些感谢Daniel。我认为F#有一个“纯”关键词。不是吗?我想我在反射器中的BCL中看到了一些东西。“考虑到F#不是一种纯粹的函数式语言”。事实上,纯洁是无关紧要的。@Jon:那就是你错的地方。这是非常相关的。编译器不能那样做必要的假设。几十年来,我们已经为Fortran等命令式语言提供了向量化编译器。我的观点是,事实证明,在多核并行环境中,它们实际上与纯度一样无用。Fortan是一种命令式语言。它永远不会简单地鹦鹉学舌,是简单地鹦鹉学舌,还是自动鹦鹉学舌?实际上,Fortran比Haskell更容易获得良好的并行性能。。。