【发布时间】:2011-04-08 12:39:32
【问题描述】:
我正在研究多核处理器;具体来说,我正在研究为多核处理器编写代码以及为多核处理器编译代码。
我很好奇该领域目前会阻止广泛采用编程技术和实践以充分利用多核架构的力量的主要问题。
我知道以下努力(其中一些似乎与多核架构没有直接关系,但似乎与并行编程模型、多线程和并发性有更多关系):
- Erlang(我知道 Erlang 包含促进并发性的结构,但我不确定它究竟是如何用于多核架构的)
- OpenMP(似乎主要与多处理和利用集群的力量有关)
- Unified Parallel C
- Cilk
- Intel Threading Blocks(这似乎与多核系统直接相关;因为它来自英特尔,所以很有意义。除了定义某些编程结构外,它似乎还具有告诉编译器优化多核架构代码的功能)李>
总的来说,根据我对多线程编程的一点经验,我知道考虑到并发和并行性的编程绝对是一个困难的概念。我也知道多线程编程和多核编程是两个不同的东西。在多线程编程中,您要确保 CPU 不会保持空闲(在单 CPU 系统上。正如 James 指出的那样,操作系统可以调度不同的线程在不同的内核上运行——但我更感兴趣的是描述来自语言本身,或通过编译器)。据我所知,您无法真正进行并行操作。在多核系统中,您应该能够执行真正的并行操作。
所以在我看来,目前多核编程面临的问题是:
- 多核编程是一个困难的概念,需要高超的技能
- 当今的编程语言中没有原生结构可以为多核环境的编程提供良好的抽象
- 除了 Intel 的 TBB 库之外,我还没有发现其他编程语言在利用多核架构的强大功能进行编译(例如,我不知道 Java 或 C# 编译器是否优化了多核系统的字节码或即使 JIT 编译器这样做)
我很想知道可能存在哪些其他问题,以及是否有任何解决方案可以解决这些问题。链接到研究论文(和那种性质的东西)会很有帮助。谢谢!
编辑
如果我必须将我的问题浓缩为一句话,那就是:当今多核编程面临哪些问题,该领域正在进行哪些研究来解决这些问题?
更新
在我看来,多核需要关注三个层面:
- 语言级别:抽象并行化和并发性并使程序员能够轻松表达相同内容的构造/概念/框架
- 编译器级别:如果编译器知道它正在编译的架构,它可以优化该架构的编译代码。
- 操作系统级别:操作系统优化运行的进程,并可能调度不同的线程/进程在不同的内核上运行。
我在 ACM 和 IEEE 上进行了搜索,并找到了一些论文。他们中的大多数人都在谈论并发思考是多么困难,以及当前的语言如何没有适当的方式来表达并发性。有些人甚至声称我们当前的并发模型(线程)不是处理并发的好方法(即使在多核上)。我有兴趣听听其他意见。
【问题讨论】:
-
您能解释一下并行编程模型和多线程的设计与多核编程有何不同吗?
-
如果您的语言支持多核并且您的操作系统支持良好,它可以确保线程在不同的内核或处理器上,因此您的多线程应用可以并发运行。
-
您可能想阅读stackoverflow.com/questions/181284/… 并更好地理解该主题。
-
@James 我认为并行编程和多核编程比多线程和多核编程有更多的共同点。我应该在我的问题中提到我在谈论单 CPU 系统上的多线程。我可以看到操作系统如何安排不同的线程在不同的内核上运行,但我更感兴趣的是使用语言/编译器本身来描述并行性。
-
@Vivin,至少从开发的角度来看,并行/多线程/多核编程之间确实没有区别。 Intel Threading Blocks 和 OpenMP 等库只是通过隐藏细节使并行化更容易的抽象。多核编程本质上与多处理器编程相同(但魔鬼在细节中)。您只需拥有 1 个以上的物理 CPU 即可在其上执行线程。此外,您有时会发现单处理器和多处理器机器之间的行为不同。
标签: multicore