8

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

我对两者都没有太多经验,但我想将我的编码风格转变为上述任何一种。

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

4

7 回答 7

13

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

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

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

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

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

于 2009-07-02T09:02:48.730 回答
3

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

单处理器上的多线程编程

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

多处理器上的多线程编程

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

于 2019-11-16T22:14:55.053 回答
2

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

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

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

于 2009-07-02T08:18:07.960 回答
2

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

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

于 2009-07-02T08:20:34.477 回答
1

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

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

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

于 2009-07-02T08:37:04.163 回答
0

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

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

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

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

于 2009-07-02T08:16:47.043 回答
0

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

于 2013-08-17T08:53:02.613 回答