【发布时间】:2009-07-02 08:06:40
【问题描述】:
我们可以在单个 cpu 上交替使用“并行编码”和“多线程编码”吗?
我在这两个方面都没有多少经验, 但我想将我的编码风格转变为上述任何一种。
我现在发现很多单线程应用程序已经过时,对于未来的软件行业作为职业前景,哪个会更好?
【问题讨论】:
标签: multithreading parallel-processing multiprocessor
我们可以在单个 cpu 上交替使用“并行编码”和“多线程编码”吗?
我在这两个方面都没有多少经验, 但我想将我的编码风格转变为上述任何一种。
我现在发现很多单线程应用程序已经过时,对于未来的软件行业作为职业前景,哪个会更好?
【问题讨论】:
标签: multithreading parallel-processing multiprocessor
多线程和并行编码/计算之间肯定存在重叠,主要区别在于目标处理架构。
多线程已被用于在具有共享内存的单个 CPU 上的单个进程中利用并发的优势。在具有多个 CPU 的机器上运行相同的程序可能会导致显着的加速,但通常是一种奖励而不是预期的(直到最近)。许多操作系统都有线程模型(例如pthreads),它们受益于但不需要多个 CPU。
多处理是针对多个 CPU 的并行编程的标准模型,从早期的 SMP 机器在大型机器上具有多个 CPU,然后到跨多台机器的集群计算,以及现在回到一台计算机上的许多 CPU/内核。 MPI 是一个标准,可以在许多不同的架构中工作。
当然,可以使用带有语言框架(如OpenMP)的线程来编写并行设计。我听说过依赖于理论上可以在任何地方运行的单独处理的多组件 GUI/应用程序。实际上,前者比后者多。
主要区别可能是程序在多台机器上运行时,使用多线程是不切实际的,并且共享内存的现有应用程序将无法运行。
【讨论】:
并行编码是并行(同时)执行多个动作的概念。
单处理器上的多线程给人一种并行运行的错觉。在幕后,处理器根据线程的优先级在线程之间切换。
多处理器内核上的多线程是真正的并行。每个微处理器都运行一个线程。因此,会同时发生多个并行的并发任务。
【讨论】:
这个问题有点令人困惑,因为您可以在多个线程中执行并行操作,但所有多线程应用程序都没有使用并行计算。 在并行代码中,通常有许多“工作人员”使用一组数据以异步返回结果。但多线程的使用范围更广,例如 GUI、阻塞 I/O 和网络。
在单个或多个 CPU 上变化不大,因为管理取决于您的操作系统如何处理线程和进程。
多线程无处不在,并行不是日常计算范式,因此它可能是职业前景中的“利基”。
【讨论】:
我在 .NET 4.0 中看到的一些演示,并行代码更改似乎比做线程更容易。 “For Loops”和其他支持并行处理的东西有新的语法。所以还是有区别的。
我认为将来你会同时做这两件事,但我认为 Parallel 支持会更好、更容易。您仍然需要线程来进行后台操作和其他事情。
事实上,您无法在单个 CPU 上实现“真正的”并行性。有几个库(例如 C 的 MPI)在这方面有所帮助。但是并行性的概念并不是在开发流行解决方案的开发人员中使用的。
由于在单个 CPU 上引入了多个内核,如今多线程很常见,由于线程库和线程安全类型、方法、类等,在每种语言中都可以轻松且几乎透明地实现。这样你就可以模拟并行。
无论如何,如果您从这个开始,请先阅读有关并发和线程主题的内容。当然,线程 + 并行性可以很好地协同工作。
【讨论】:
我不确定您认为“并行编码”是什么,但我理解的并行编码是指生成由 CPU 并行执行的代码,因此多线程代码属于该描述。
这样,显然你可以互换使用它们(因为一个落在另一个里面)。
不过,我建议你慢慢来,从基础开始学习。了解为什么多线程变得重要,进程、线程和纤程之间有什么区别,如何同步它们等等。
请记住,您所说的并行编码非常复杂,特别是与顺序编码相比,因此请做好准备。也不要急于求成。仅仅因为您使用 3 个线程而不是 1 个线程不会使您的程序更快,它甚至可以使其变慢。您需要了解方法和原因。并非所有事物都可以并行化,也不是所有事物都可以并行化。
【讨论】:
用简单的语言 多线程本身在 CPU 中可用,并且 并行编程是一项显式任务,要么由编译器完成,要么由程序员“#pragma”编写的我的构造完成
【讨论】: