多核系统的编程和编译状态
我正在研究多核处理器; 具体而言,我正在为多核处理器编写代码并编写多核处理器代码。
我对这一领域的主要问题感到好奇,目前这些问题会阻止广泛采用编程技术和实践来充分利用多核架构的强大功能。
我意识到以下努力(其中一些看起来与多核体系结构没有直接关系,但似乎与并行编程模型,多线程和并发性有关):
总的来说,从多少线程编程的经验来看,我知道在并发性和并行性方面进行编程绝对是一个困难的概念。 我也知道多线程编程和多核编程是两回事。 在多线程编程中,您可以确保CPU不会保持空闲(在单CPU系统上)。正如James指出的,操作系统可以安排不同的线程在不同的内核上运行 - 但我更感兴趣的是描述并行操作该语言本身或通过编译器)。 据我所知,你不能真正做平行操作。 在多核系统中,您应该能够执行真正并行的操作。
所以在我看来,目前多核编程面临的问题是:
我很想知道可能存在的其他问题,以及是否有解决方案来解决这些问题。 研究论文(以及这种性质的东西)的链接将会有所帮助。 谢谢!
编辑
如果我不得不将问题简化为一句话,那就是:今天面临多核编程的问题是什么,以及现场正在进行哪些研究来解决这些问题?
UPDATE
在我看来,多核心需要关注三个层面:
我在ACM和IEEE上搜索过,发现了几篇论文。 他们中的大多数人都在谈论同时思考有多困难,以及当前的语言如何没有合适的方式来表达并发性。 有些人甚至宣称我们拥有的当前并发模型(线程)并不是处理并发(即使在多核上)的好方法。 我有兴趣听取其他意见。
多核编程的主要问题与编写任何其他并发应用程序相同,但在计算机中有多个cpus之前很少见,现在很难找到任何只有一个核心的现代计算机,因此,多核,多CPU结构的优势面临新的挑战。
但是,这个问题是一个老问题,只要计算机体系结构超出编译器范围,那么似乎退步解决方案就是回到函数式编程,因为如果严格遵循编程范例,可以制作非常可并行的程序,因为您没有例如,任何全局可变变量。
但是,并非所有问题都可以使用FP轻松完成,因此目标就是如何轻松地让其他编程范例易于在多核上使用。
首先,许多程序员避免编写好的多线程应用程序,所以没有大量的开发人员,因为他们学习的习惯会使他们的编码变得更难。
但是,与对cpu的大多数更改一样,您可以查看如何更改编译器,并且可以查看Scala,Haskell,Erlang和F#。
对于库,您可以通过MS查看并行框架扩展,以便更轻松地进行并发编程。
它正在起作用,但最近IEEE Spectrum或IEEE Computer有关于多核编程问题的文章,所以请看看IEEE和ACM的文章是如何写入这些问题的,以获得更多关于正在研究的内容的想法。
我认为最大的障碍将是难以让程序员改变他们的语言,因为FP与OOP完全不同。
除了开发能够以这种方式工作的语言之外,研究的一个地方是如何处理访问内存的多线程,但就像这方面的很多内容一样,Haskell似乎在测试这方面的想法方面处于最前沿,所以您可以看看Haskell发生了什么事。
最终会有新的语言,可能我们有DSL来帮助更多地抽象开发人员,但如何教育程序员将是一个挑战。
更新:
你可以找到第24章。感兴趣的并发和多核编程,http://book.realworldhaskell.org/read/concurrent-and-multicore-programming.html
我对这一领域的主要问题感到好奇,目前这些问题会阻止广泛采用编程技术和实践来充分利用多核架构的强大功能。
惯性。 (顺便说一句:这几乎是所有“阻止广泛采用”问题的答案,无论是并行编程模型,垃圾收集,类型安全还是节能汽车。)
我们从20世纪60年代就已经知道线程+锁模型从根本上被打破了。 到1980年,我们有大约十几个更好的模型。 然而,目前使用的绝大多数语言(包括1980年以后新创建的语言)只提供线程+锁。
其中一个答案提到了.NET Framework的并行扩展,并且自从你提到C#以来,这绝对是我要调查的东西。 微软在那里做了一些有趣的事情,尽管我不得不认为他们的许多努力似乎更适合C#中的语言增强,而不是独立且不同的并发编程库。 但我认为他们的努力值得称赞和尊重,我们早在这里。 (免责声明:我大约3年前曾经是Visual Studio的市场总监)
英特尔线程构建模块也很有趣(英特尔最近发布了一个新版本,我很高兴能够下周到英特尔开发人员论坛,详细了解如何正确使用它)。
最后,我在西雅图的Corensic公司工作。 我们有一个名为Jinx的工具,用于检测代码中的并发错误。 一个30天的试用版可用于Windows和Linux,所以你可能想看看它。 (www.corensic.com)
简而言之,Jinx是一个非常薄的管理程序,当它被激活时,会在处理器和操作系统之间滑行。 然后Jinx智能地执行切片并运行各种线程时序的模拟以查找错误。 当我们发现一个特定的线程计时会导致一个错误发生时,我们会在你的机器上使这个计时“真实”(例如,如果你正在使用Visual Studio,那么调试器将在那一刻停止)。 然后我们指出代码中导致错误的地方。 Jinx没有误报。 当它检测到一个错误时,肯定是一个错误。
Jinx适用于Linux和Windows,以及本地和托管代码。 它是语言和应用程序平台不可知论的,并且可以与您现有的所有工具一起使用。
如果您检查出来,请向我们反馈什么有效和无效的反馈。 我们已经在一些大型的开源项目上运行Jinx,并且已经看到Jinx能够比简单的压力测试代码快50-100倍的bug。
链接地址: http://www.djcxy.com/p/68785.html上一篇: The state of programming and compiling for multicore systems