并发不是并行吗? [关闭]

2024-03-31

Here http://concur.rspace.googlecode.com/hg/talk/concur.html#title-slide这是 Rob Pike 对此的幻灯片。每次我经历这个,我都觉得自己像个白痴。我无法弄清楚它的要点。众所周知,并发是将复杂问题分解为更小的组件。如果你不能正确地将某件事分成更小的部分,那么就很难使用并发来解决它。

但是幻灯片中并没有详细介绍如何在实现并发后获得并行性。在课程幻灯片(编号 52)中,他说并发 - “也许甚至是并行”。但问题是——并发何时以及如何正确有效地实现并行?

我的猜测是,在幕后 Rob 指出开发人员应该在并发级别上工作 - 并且并行性应该是语言/虚拟机的关注点(gomaxprocs?)。只关心智能分解为更小的单元,只关心正确的并发性 - 并行性将由“系统”负责。

请透露一些信息。


罗布·派克的意思是什么

当您想到算法的抽象形式时,您必须选择是否使用消息传递或共享内存或混合来实现它。您还必须考虑内存访问的类型(NUMA、UMA 等)和使用的拓扑(Hypercube、Torus、Ring、Mesh、Tree 等)

对于那些只想以并行方式(例如并行 for)完成某件事(甚至可能很简单)的人来说,这似乎是一项艰巨的工作。

这需要大量工作,特别是如果您更改拓扑(这样您就可以拥有其所有优点)。

因此,您编写并行代码(无论简单还是复杂),VM 或编译器将选择似乎最好的方法,甚至以顺序方式运行!(一个例子是 .net 的任务并行库)

重要编辑:

我应该提到的是,我谈论的是程序/算法中的并发性,而不是系统中运行的独立程序之间的并发性。

你之前这么说

众所周知,并发是将复杂问题分解为更小的组件。如果你不能正确地将某件事分成更小的部分,那么就很难使用并发来解决它

但这是错误的 b/c这些较小的组件可能以顺序方式相互依赖来完成,所以即使你划分成小组件,也不意味着你实现了并发/并行。

在我所有的并行和分布式算法类别中(无论是学士还是硕士)我们从未谈论过“我们获得了并发性,现在让我们看看如何获​​得并行性如果你使用并发这个词来描述和算法,那么你就意味着并行,反之亦然。

在文献中,您还会发现分布式和并行之间只有一线之隔。

从算法的角度来看,您可以使用并发、并行和分布式,并且您会得到相同的想法。

从实现的角度来看,如果你说“并行”,你通常指的是一个在本地计算机或集群上运行的程序(共享内存通信),而当你在网格上运行该程序时是“分布式”的(消息传递通信) 。

现在,分布式和并行性都意味着并发。

我认为你应该对这些术语的确切含义更加怀疑,因为即使在文献中(我谈论的是那些真正为这个领域做出贡献的人,而不仅仅是创造某种语言),它们也被用来表达抽象概念。

算法(无论是程序)的并发性意味着拥有可以独立于其他代码段运行的代码段,即使它们最终会等待其他一些代码段(检查阿姆达尔定律以准确了解其含义)。

因此,只要算法/程序中存在并发性,那么也就具有并行性。

我认为最好只实现一些并行和分布式算法,以更好地理解其背后的想法。如果您了解 C/C++,则可以使用 OpenMPI 进行分布式(消息传递)实现,使用 OpenMP 进行并行(共享内存)实现。

EDIT:

他还可以将并发视为抽象原则,并将并行视为其实现方式[共享内存、消息传递、两者之间的混合;内存访问类型(numa、uma 等)]。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

并发不是并行吗? [关闭] 的相关文章

  • 信号量如何工作?

    信号量可以小于0吗 我的意思是 假设我有一个 N 3 的信号量 并且我调用 down 4 次 那么 N 将保持为 0 但一个进程将被阻塞 反之亦然 如果一开始我调用 N 可以大于 3 吗 因为在我看来 如果 N 可以高于 3 如果一开始我调
  • 易失性变量的读-修改-写操作如何保证线程安全

    我正在阅读 JCIP 但无法理解 3 3 1 中的以下声明 只要您可以确保仅从单个线程写入易失性变量 对共享易失性变量执行读取 修改 写入操作就是安全的 在这种情况下 您将修改限制在单个线程中以防止竞争条件 并且易失性变量的可见性保证可确保
  • MFC:从另一个线程调用 CWnd 方法安全吗?

    其实我有两个问题 打电话安全吗SendMessage来自工作线程 Do CWnd方法 比如MessageBox 调用API函数SendMessage幕后 根据我的理解 当工作线程调用时SendMessage 它将消息推送到UI线程的消息队列
  • 为什么单线程异常会导致整个程序崩溃(如何防止这种情况?)

    例如 如果我跑步 int x 0x00000 程序崩溃了 但为什么整个程序崩溃而不是单个线程崩溃呢 我创建了多个连续睡眠的线程来测试这一点 有什么方法可以让当前线程退出 而不是整个程序 在Windows上使用winapi Thanks 但为
  • 在使用 stop_token 等待条件变量_any 时是否需要拥有锁来请求停止?

    在等待条件变量时 更改谓词状态的线程必须拥有锁 因此在唤醒期间不会错过更新 根据文档 这是必要的 即使在使用原子变量时也是如此 不过我不确定是否request stop 已经正确处理了 那么问题是 这两个选项中哪一个是正确且符合标准的呢 j
  • 如何使用 OpenMP 并行化数组移位?

    如何使用 OpenMP 并行化数组移位 我已经尝试了一些方法 但没有得到以下示例的任何准确结果 该示例旋转 Carteira 对象数组的元素 用于排列算法 void rotaciona int i Carteira aux this gt
  • C++ 类内线程并发

    我试图在一个类中运行两个并发线程 它们都使用相同的函数打印数据 使用 std lock guard 进行作用域锁 问题是只有第一个线程被触发 第二个线程永远不会被调用 include
  • 使 [IsOneWay=true] WCF 服务异步和使用客户端上的任务调用同步方法之间有显着差异吗?

    如果我有这样定义的服务 ServiceContract SessionMode SessionMode NotAllowed public interface IMyService OperationContract IsOneWay tr
  • 为什么将 volatile 与同步块一起使用?

    我在java中看到了一些示例 其中他们在代码块上进行同步以更改某些变量 而该变量最初被声明为易失性 我在单例类的示例中看到 他们将唯一实例声明为易失性 并且同步了该块初始化该实例 我的问题是为什么我们在同步它时声明它是易失性的 为什么我们需
  • RabbitMQ-在一个应用程序进程中为单个队列创建多个消费者是一种好习惯吗

    我刚刚处理一个由 RabbitMQ 支持的新项目 并且在应用程序启动时创建了多个监听同一个队列的消费者实例 然而 它们与不同的渠道共享相同的连接 来自队列的消息非常庞大 一次生成行为有数百万条消息 因此我猜第一个代码作者正在尝试做一些事情来
  • Android SurfaceView 使用线程绘制画布

    我正在尝试使用线程在画布上绘图来创建一个简单的游戏引擎 但我遇到了一些无法解释的奇怪问题 这个 游戏 的目的是每秒在画布上画一个圆圈 这是可行的 但不是我想要的工作方式 似乎应用程序正在两个画布之间切换 并向每个画布添加一个圆圈 这样您就可
  • Shared_ptr 线程安全的开销是多少?

    std shared ptr保证是线程安全的 我不知道典型的实现使用什么机制来确保这一点 但肯定它必须有一些开销 即使您的应用程序是单线程的 这种开销也会存在 是上述情况吗 如果是这样 如果您不使用线程安全保证 这是否意味着它违反了 您不为
  • 非阻塞方法中的饥饿

    一段时间以来 我一直在阅读有关非阻塞方法的内容 这是一段所谓的无锁计数器的代码 public class CasCounter private SimulatedCAS value public int getValue return va
  • 如何在c#中指定时间后取消后台工作者

    如何在 C 中的指定时间后取消后台工作程序或取消无响应的后台工作程序 看看这个教程 http www albahari com threading part3 aspx http www albahari com threading par
  • Java 8 Stream - 并行执行 - 不同的结果 - 为什么?

    假设我有一个List
  • SLURM 节点、任务、核心和 CPU

    有人能够澄清这些东西到底是什么吗 据我所知 节点是集群内的计算点 本质上是一台计算机 任务是可以在单个节点或多个节点上执行的进程 核心基本上是指您希望在单个节点上分配多少 CPU 来执行分配给该 CPU 的任务 它是否正确 我混淆了什么吗
  • iPhone 相当于 Application.DoEvents();

    iPHone 我们使用 MonoTouch 但 Obj C 答案还可以 我的单例域对象需要一段时间才能获取所有数据 因此它在线程中内部运行部分获取数据 我需要通知 UI 域已完成 目前我正在这样做 有没有更好的办法 在 WinForms 中
  • 为什么 Spark 没有使用本地计算机上的所有核心

    当我在 Spark Shell 中或作为作业运行一些 Apache Spark 示例时 我无法在单台计算机上实现完全的核心利用率 例如 var textColumn sc textFile home someuser largefile t
  • 当可能存在迭代器时替换并发集合是否是线程安全的?

    我一直在阅读各种内容 似乎这应该有效 但我想确定一下 我有一个静态属性 它应该是一个缓存 加上一些与缓存数据相关的其他功能 它将实际数据存储在 ConcurrentBag 中 并且有一个 IEnumerable 方法来 过滤并 从此包中生成
  • 用于运行可执行文件的python多线程进程

    我正在尝试将一个在 Windows 上运行可执行文件并管理文本输出文件的 python 脚本升级到使用多线程进程的版本 以便我可以利用多个核心 我有四个独立版本的可执行文件 每个线程都知道要访问它们 这部分工作正常 我遇到问题的地方是当它们

随机推荐