Questions tagged «parallelism»

8
“并行”执行与“并行”执行之间的区别?
是什么方面的区别并发和并行执行?我从来没有完全能够理解这种区别。 该标签将并发定义为同时运行两个进程的方式,但是我认为并行性是完全相同的事情,即:可能在单独的处理器上运行的单独的线程或进程。 另外,如果我们考虑使用异步I / O之类的东西,那么我们是在处理并发性还是并行性?

10
如何解释为什么多线程很难
我是一个相当不错的程序员,我的老板也是一个相当不错的程序员。尽管他似乎低估了诸如多线程之类的某些任务以及它的难度(我发现,除了运行几个线程,等待所有线程完成然后返回结果之外,其他事情非常困难)。 当您开始担心僵局和比赛条件时,我觉得这很困难,但老板似乎并不喜欢这一点-我认为他从未遇到过。只是打个锁就差不多了。 那么,我如何介绍他,或者解释为什么他可能低估了并发,并行和多线程的复杂性?还是我错了? 编辑:他做了些什么-遍历一个列表,为该列表中的每个项目创建一个线程,该线程根据该项目中的信息执行数据库更新命令。我不确定他如何控制一次执行多少个线程,我想如果运行太多(如果他使用信号量的话),他一定会将它们添加到队列中。

11
并发性:如何处理设计和调试实现?
我已经开发并发系统已有好几年了,尽管我缺乏正规的培训(即没有学位),但我对这个主题掌握得很好。最近至少有一些新的语言变得流行起来,这些语言至少是为了简化并发而设计的,例如Erlang和Go。似乎他们的并发方法呼应了我自己的经验,即如何使系统具有可伸缩性并利用多个内核/处理器/机器。 但是,我发现很少有工具可以帮助您可视化您打算做什么,并可以验证您至少与最初的设想接近。使用非专为并发设计的语言(例如C / C ++,C#,Java等),调试并发代码可能是一场噩梦。特别是,几乎不可能在开发环境中的一个系统上重新创建容易发生的条件。 那么,您设计系统来处理并发和并行处理的方法是什么?例子: 您如何确定可以同时进行的和必须进行顺序的? 您如何重现错误条件并查看应用程序执行时发生的情况? 您如何可视化应用程序的不同并发部分之间的交互? 对于这些问题,我有自己的答案,但我还想了解更多。 编辑 到目前为止,我们有很多不错的建议。链接到的许多文章都非常好,我已经阅读了其中的一些文章。 我在并发编程方面的个人经历使我相信与顺序编程相比,您需要不同的思维方式。精神鸿沟可能与面向对象编程和过程编程之间的差异一样大。我希望这组问题更多地集中在系统地解决问题所必需的思维过程(即理论)上。提供更具体的答案时,有助于举例说明-您亲自进行了一些研究。 赏金目标 不要告诉我该怎么办。我已经控制住了。告诉我你做什么。告诉我您如何解决这些问题。

5
面向对象的编程范式由于反模块化和反并行性而过时了吗?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 5年前关闭。 我已经读过CMU教授罗伯特·哈珀(Robert Harper)发表的有争议的文章《向新生学习FP》。他声称CMU将不再在入门课程中教授面向对象的编程,因为它“不适合现代CS课程”。 他声称: 面向对象的编程从入门课程中就完全消除了,因为它的本质是反模块化的和反并行的。 为什么将OOP视为反模块化和反并行的?

1
使用唯一性类型实现安全的并行性
一段时间以来,我一直对唯一性类型感兴趣,以替代纯函数式语言中的monad。不幸的是,这是CS研究的一个深奥领域,有关具有唯一性类型的编程的在线资源非常少。 显而易见,如何将唯一性类型用于实现状态数据结构,例如引用(“框”)和数组,尽管这使我无法理解如何使用它们来实现其他常见的状态数据结构。 例如,可以实现唯一类型的锁定吗?可以使用唯一性类型在线程之间共享可变数据吗?是否可以使用唯一类型来构建同步原语(例如互斥体),或者是否需要传递消息?

3
并行性意味着并发,但不是相反吗?
我经常读到并行性和并发性是不同的东西。答题者/评论者经常会写到他们是两个完全不同的事物。但是我认为它们是相关的,但我想对此进行一些说明。 例如,如果我在多核CPU上并设法将计算分成x个较小的计算(例如使用fork / join),每个计算均在其自己的线程中运行,则我将拥有一个同时进行并行计算的程序(因为大概在任何时候,几个线程都将在多个内核上运行)并且是并发的吗? 虽然如果我只是简单地使用Java,并处理事件调度线程上的UI事件和重绘,再运行我创建的唯一线程,那么我将拥有一个并发程序(EDT + GC线程+我的主线程)等),但不是并行的。 我想知道我是否正确,并行性(在“单核但多核”系统上)是否总是暗示并发? 另外,是否在多核CPU上运行多线程程序,但是不同线程在进行完全不同的计算的情况下是否考虑使用“并行性”?

1
最佳实践是不轮询...但是当线程调用wait()时,轮询是否不会在内部进行?
假设我们有一些线程想要检查另一个线程何时完成其任务。我已经读到我们应该调用一个wait()类型的函数,该函数将使该线程等待,直到它收到另一个线程完成的通知。这样做很好,因为这意味着我们不会执行昂贵的轮询。 但是反正不是在内部进行较低级别的轮询吗?也就是说,如果我们使线程wait()是内核不执行轮询来检查另一个线程何时完成,以便它可以随后通知第一个线程? 我想我在这里错过了什么,有人可以启发我吗?

5
为什么隐式并行/并发没有得到更广泛的应用?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 4年前关闭。 隐式并行性^可以减轻许多程序员的负担,并将其放置在计算机上。那么...为什么它现在不普及? ^隐式并行性是使计算机能够一次弄清楚自己如何做一件事,而不是程序员需要使用线程等来完成这项工作。

2
在并行程序中处理错误的最佳方法是什么?
随着并行算法的出现,现在可能是考虑错误处理的好时机。 所以起初有错误代码。那些很烂。可以随意忽略它们,因此您可能会迟到并产生难以调试的代码。 然后是例外。这些问题一旦发生就变得不可忽视,而且大多数人(乔尔除外)更喜欢他们。 现在我们有了帮助并行代码的库。问题是,您无法像使用非并行代码那样轻松地处理并行代码中的异常。如果异步启动任务并引发异常,则没有堆栈跟踪可以展开。最好的办法是捕获它并将其注册在任务对象上(如果有)。但是,它破坏了异常的主要优势:您必须检查它们,并且可以不加任何考虑地忽略它们,而在单线程代码中,异常必然会触发适当的操作(即使这意味着终止程序)。 语言实现或库应如何支持并行代码中的错误?

4
Java的主要重点是什么?为什么要花这么长时间才能获得新功能?
我一直在探索JDK8中的新功能,例如lambda表达式,扩展方法和新的流API。 显然,这些功能都不是编程世界中的新增功能,这使人们感到奇怪的是,为什么到目前为止在Java中都无法获得所有这些功能。 Lisp(1958),SML(1973),Haskell(1990),Python(1991),JavaScript(1994),Ruby(1995),Scala(2003),C#(2007)和Lisp和55年后有lambda表达式Java(2013)中几乎所有其他人。 我在SIC(1996年)中读到有关流的信息。 我一直在想为什么现在呢?有证据表明,与其他语言竞争不是动机。 看来,此Java版本中的所有很酷的新功能只是实现并行性的副产品。我们之所以拥有lambda,是因为它们使编写并行算法变得更加简单,而我们拥有扩展方法,是因为我们需要它们来支持lambda表达式所需的更改等。 因此,我的问题是:我们能否安全地确认即将发布的Java版本中的主题实际上是并行性?还是我们可以证明迄今为止使用Java编写本书中最古老的技巧的其他原因?

2
为何程序员要定义编程模型来代替C / POSIX进行并行处理?
新计算机体系结构的提供者经常尝试引入新的编程模型,例如,最近用于GPGPU的CUDA / OpenCL,并取代C / POSIX作为平台并行性的控制接口。(Poss&Koening,AM3:迈向面向多核的硬件Unix加速器,2015年) 为什么架构设计师尝试设计新的编程模型来代替C / POSIX进行并行计算?C / POSIX是不是非常适合多处理器,还是C / POSIX的原始作者在C / POSIX设计时就没有考虑并行计算的需求?还是程序员需要比C / POSIX所提供的功能更多的功能,从而诉诸于CUDA / OpenCL等新设计?

1
Prolog并行性
是否有任何序言解释器可以在功能上分解您的“程序”以提高效率? 我知道有一些关于Prolog解释器的研究,该解释器通过并行(一种典型的C程序员无法“看到”的)达到接近C的速度。有人知道这个话题吗?
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.