【问题标题】:Parallel coding Vs Multithreading (on single cpu)并行编码与多线程(在单个 cpu 上)
【发布时间】:2009-07-02 08:06:40
【问题描述】:

我们可以在单个 cpu 上交替使用“并行编码”和“多线程编码”吗?

我在这两个方面都没有多少经验, 但我想将我的编码风格转变为上述任何一种。

我现在发现很多单线程应用程序已经过时,对于未来的软件行业作为职业前景,哪个会更好?

【问题讨论】:

    标签: multithreading parallel-processing multiprocessor


    【解决方案1】:

    多线程和并行编码/计算之间肯定存在重叠,主要区别在于目标处理架构。

    多线程已被用于在具有共享内存的单个 CPU 上的单个进程中利用并发的优势。在具有多个 CPU 的机器上运行相同的程序可能会导致显着的加速,但通常是一种奖励而不是预期的(直到最近)。许多操作系统都有线程模型(例如pthreads),它们受益于但不需要多个 CPU。

    多处理是针对多个 CPU 的并行编程的标准模型,从早期的 SMP 机器在大型机器上具有多个 CPU,然后到跨多台机器的集群计算,以及现在回到一台计算机上的许多 CPU/内核。 MPI 是一个标准,可以在许多不同的架构中工作。

    当然,可以使用带有语言框架(如OpenMP)的线程来编写并行设计。我听说过依赖于理论上可以在任何地方运行的单独处理的多组件 GUI/应用程序。实际上,前者比后者多。

    主要区别可能是程序在多台机器上运行时,使用多线程是不切实际的,并且共享内存的现有应用程序将无法运行。

    【讨论】:

      【解决方案2】:

      并行编码是并行(同时)执行多个动作的概念。

      单处理器上的多线程编程

      单处理器上的多线程给人一种并行运行的错觉。在幕后,处理器根据线程的优先级在线程之间切换。

      多处理器上的多线程编程

      多处理器内核上的多线程是真正的并行。每个微处理器都运行一个线程。因此,会同时发生多个并行的并发任务。

      【讨论】:

        【解决方案3】:

        这个问题有点令人困惑,因为您可以在多个线程中执行并行操作,但所有多线程应用程序都没有使用并行计算。 在并行代码中,通常有许多“工作人员”使用一组数据以异步返回结果。但多线程的使用范围更广,例如 GUI、阻塞 I/O 和网络。

        在单个或多个 CPU 上变化不大,因为管理取决于您的操作系统如何处理线程和进程。

        多线程无处不在,并行不是日常计算范式,因此它可能是职业前景中的“利基”。

        【讨论】:

          【解决方案4】:

          我在 .NET 4.0 中看到的一些演示,并行代码更改似乎比做线程更容易。 “For Loops”和其他支持并行处理的东西有新的语法。所以还是有区别的。

          我认为将来你会同时做这两件事,但我认为 Parallel 支持会更好、更容易。您仍然需要线程来进行后台操作和其他事情。

          【解决方案5】:

          事实上,您无法在单个 CPU 上实现“真正的”并行性。有几个库(例如 C 的 MPI)在这方面有所帮助。但是并行性的概念并不是在开发流行解决方案的开发人员中使用的。

          由于在单个 CPU 上引入了多个内核,如今多线程很常见,由于线程库和线程安全类型、方法、类等,在每种语言中都可以轻松且几乎透明地实现。这样你就可以模拟并行。

          无论如何,如果您从这个开始,请先阅读有关并发和线程主题的内容。当然,线程 + 并行性可以很好地协同工作。

          【讨论】:

          • 除了 erlang 之外,几乎任何语言都不容易实现多线程。
          • 我听说过很多关于 erlang 和 erlang 上的并行性。不幸的是我不懂这种语言。通过简单的多线程,我的意思是创建多个线程并使它们连贯地工作。我知道这不是微不足道的,但考虑寻找解决问题的另一种解决方案而不是线程并不难。
          • @Jorge - 我不认为 erlang 使用线程,而是不共享内存的轻量级进程
          • -1 用于编写多线程编程很容易。根据我的经验,大多数人最好改进他们的单线程代码或生成更多单线程 Web 应用实例。
          【解决方案6】:

          我不确定您认为“并行编码”是什么,但我理解的并行编码是指生成由 CPU 并行执行的代码,因此多线程代码属于该描述。

          这样,显然你可以互换使用它们(因为一个落在另一个里面)。

          不过,我建议你慢慢来,从基础开始学习。了解为什么多线程变得重要,进程、线程和纤程之间有什么区别,如何同步它们等等。

          请记住,您所说的并行编码非常复杂,特别是与顺序编码相比,因此请做好准备。也不要急于求成。仅仅因为您使用 3 个线程而不是 1 个线程不会使您的程序更快,它甚至可以使其变慢。您需要了解方法和原因。并非所有事物都可以并行化,也不是所有事物都可以并行化。

          【讨论】:

            【解决方案7】:

            用简单的语言 多线程本身在 CPU 中可用,并且 并行编程是一项显式任务,要么由编译器完成,要么由程序员“#pragma”编写的我的构造完成

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2017-03-07
              • 2014-07-05
              • 2016-08-10
              • 1970-01-01
              • 1970-01-01
              • 2021-10-13
              • 2018-07-03
              • 1970-01-01
              相关资源
              最近更新 更多