我已经读的地方,编程功能是适当利用多芯的趋势计算的。我并没有真正得到的想法。它是有关氧微积分和冯*纽曼架构?

有帮助吗?

解决方案

功能编程最小化或消除副作用,因此更适合分布式编程。即多核处理。

换句话说,很多拼图可以在不同的核心上同时独立解决,而不必担心一个操作影响另一个操作几乎和其他编程风格一样多。

其他提示

处理并行处理最困难的事情之一是锁定数据结构以防止损坏。如果两个线程同时改变数据结构而没有完全锁定,则可能导致从无效数据到死锁的任何事情。

相比之下,函数式编程语言倾向于强调不可变数据。任何状态都与逻辑分开,一旦创建了数据结构,就无法修改。锁定的需求大大减少。

另一个好处是,一些非常容易并行化的进程(如迭代)被抽象为函数。在C ++中,您可能有一个for循环,它对列表中的每个项目运行一些数据处理。但是编译器无法知道这些操作是否可以安全地并行运行 - 可能一个操作的结果取决于之前的操作。当使用 map() reduce()之类的函数时,编译器可以知道调用之间没有依赖关系。因此可以同时处理多个项目。

我已经读的地方,编程功能是适当利用多芯的趋势计算...我并没有真正得到的想法。它是有关氧微积分和冯*纽曼架构?

参数后面的信念,你引述的是纯粹的功能编程控制的副作用,这使得它更加容易和更安全的介绍并行的,因此,这一纯粹的功能编程语言应是有利的背景下多核计算机。

不幸的是,这一信念是早已证明对于几个原因:

  • 绝对性的纯粹的功能的数据结构是可怜.所以纯粹的功能编程是一个大的初始步骤在错误的方向上下文中的表现(其的唯一目的是并行程序).

  • 纯粹的功能的数据结构的规模严重,因为他们压力,共享资源,包括分配/GC和主存储器的带宽。所以并行纯属功能性的方案往往得到贫穷的加速作为核心数目的增加而增加。

  • 纯粹的功能编程使业绩难以预测。所以真正的纯粹的功能程序经常看到的性能 退化 时并行,因为粒度是有效的。

例如,变 两个线的快速排序 经常被引用的Haskell社区通常运行数千次的速度慢于实地的快速排序写入一个更传统的语言喜欢F#。此外,虽然可以很容易地并行优雅Haskell的程序,你不可能看到任何改善性能的任何责任,因为所有不必要的复制,使得一个单一的核心饱和整个主存储器的带宽的一个多机、绘制并行的毫无价值的。事实上,没有人曾经设法编写任何一种通用的平行进行排序在Haskell,是竞争性能。国家的技术种类提供Haskell的标准图书馆通常是几百倍的速度比传统的替代品。

然而,更多的共同定义的编程功能作为一种风格是强调使用的一流的功能并实际上是非常有用的背景下多核编程,因为这种模式适用于保理业务的平行程序。例如,见新的更高了 Parallel.For 从功能 System.Threading.Tasks 名字空间。净4.

当没有副作用时,评估顺序无关紧要。然后可以并行评估表达式。

基本论点是很难自动并行化像C / C ++ /等语言,因为函数可以设置全局变量。考虑两个函数调用:

a = foo(b, c);
d = bar(e, f);

虽然foo和bar没有共同的参数,并且不依赖于另一个的返回代码,但它们仍然可能具有依赖关系,因为foo可能会设置一个全局变量(或其他副作用),而bar依赖于它。

功能语言保证foo和bar是独立的:没有全局变量,也没有副作用。因此,foo和bar可以安全地在不同的内核上运行,无需程序员干预。

上面的所有答案都是关于“没有共享的可变存储”的关键思想。是并行执行程序片段的关键推动因素。它并没有真正解决同时发现并行执行事情的难题。但是,功能语言中典型的更清晰的功能表达确实使得从顺序表达式中提取并行性变得更容易。

在实践中,我认为“没有共享的可变存储”。基于垃圾收集和copy-on-change语义的语言属性使得更容易添加线程。最好的例子可能是Erlang,它将近功能语义与显式线程相结合。

这是一个模糊的问题。多核CPU的一个优点是你可以运行一个功能程序,让它连续插拔,而不用担心会影响与机器正在执行的其他功能有关的任何计算。

服务器或PC中的多U服务器和多核CPU之间的区别在于,通过将其置于同一总线上可以节省速度,从而可以更好,更快地与核心进行通信。

编辑:我应该对这篇文章进行限定,因为在我做的大部分脚本中,无论是否有多个内核,我都很少看到通过hackish并行化获取数据的问题,例如一次运行多个小脚本我的脚本所以我不会因为等待加载URL而不加载什么而放慢速度。

双重编辑:此外,许多函数式编程语言已经使用了分叉并行变体数十年。这些更好地利用了并行计算并提高了速度,但它们从未真正流行起来。

省略任何技术/科学术语的原因是因为功能程序不共享数据。数据在函数之间复制和传输,因此应用程序中没有共享数据。

共享数据是多线程导致一半头痛的原因。

Joe Armstrong的书籍编程Erlang:并发世界的软件 Erlang 的创建者)谈论使用 Erlang 。正如维基百科文章所述:

  

在Erlang中创建和管理进程是微不足道的,而在大多数语言中,线程被认为是一个复杂且容易出错的主题。尽管Erlang中的所有并发都是显式的,但进程使用消息传递而不是共享变量进行通信,这样就无需锁定。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top