英特尔和多核工具
作者:风河首席技术官Tomas Evensen September 20, 2006
文章来源:http://www.ednchina.com/blog/tomas/
英特尔正在发布用于帮助程序员运用多核技术的工具。看看the news.com的故事: Intel: Optimize applications for multicore. (英特尔:优化用于多核处理器上的应用程序)。在文章中, James・Reinders 声明, “编写多个线程本身并不困难, 而是开发人员需要习惯我们需要工具帮助的思维方式。” 虽然我也同意开发人员需要习惯那种思维方式,但是实际上我相信, 编写多线程的应用程序本身也是很困难的。我发白的头发可以证明这一点...
令人质疑的是,“为什么多核与单核(或唯一内核)的发展会显现如此的不同呢?”
原因之一是,多数软件是用非常连惯的方式写出来。这意味着,一个程序处理的事件队列能够很好地被定义和控制,那正是程序员喜欢的。同步和调试同时进行是不足为奇的,你可以经常使用普通范例设置断点、停止编码、查看代码,然后继续。
如果想更加充分地发挥多核技术的潜能,你需要并行地执行任务。如果当第一个内核在执行简洁的顺序程序时其它的内核不得不进入挂起状态,那么增加额外的内核是没有意义的。同步执行意味着,你需要将多个计算指令分别放到多个线程中,并让他们同时运行。我们知道同时做许多事是很困难的。特别是如果你是男性(也许会存在神话,如果你是前总统就更是如此)。
在编程中,多任务中的困难常常出现在你共享数据以及多任务同时访问数据时,这已被传统的售票问题证实。如果在数据库上,一个拥有剩余票的数量的事件不受保护,会出现资源竞争的情况:
数据库中票(TicketsLef): 10 .
票代理处A从TicketsLeft读: 10 .
票代理处B从TicketsLeft读: 10 .
票代理处A 减1 和写回: 9 .
票代理处B 减1 和写回: 9 .
数据库中票: 9
这样你花一张票钱买了两张票。
使用某种锁是一种典型的保护的方法,它可以确保只有当A完成访问之后,才让B出票。这就是互斥信号量;但受保护的事件越多,越可能使两项任务彼此互相等待,也叫死锁。
在wikipedia读很多关于racing conditions,(资源竞争)的现象、deadlocks(死锁)和semaphores(信号)的书。如前所述,在多核环境中实现多任务所遇到的问题更为严重,其原因有两个:
1. 在多核中, 您需要利用多任务使性能获得提高,而在单核中只需让你的任务很简单。
2. 由于多核处理器实际上会并行的执行临界区的代码,所以在使用多核处理器执行多任务程序时发生竞争的可能性就更大。而在单核中,只有不幸在计时器发生冲突时才会发生竞争情况。
像英特尔和HP生产的工具将通过跟踪信号和存储器存取帮助你查出这些问题。经证明得知工具是聪明的,你可以从它那里得到任何对你有利的帮助。
在Wind River的产品中, 我们有一个新的更强大的工具帮助你发现线程中以及其他方面非常棘手的问题。我认为,关于Workbench Diagnostics这个工具,你可以在不让系统停止的情况下,随时用它在任何代码行中插入可执行代码(传感器点)或记录任何你感兴趣的信息。例如,你可以在C代码中很容易地设置传感器点,核实当你访问数据时是否采用了特殊的信号量。
我坚信, 利用像Workbench Diagnostics这样的工具是多数人将来调试复杂问题的方式。当你遇到同步问题,并且当最棘手的问题就是同步问题时,停止系统并使用传统的设置断点的调试方式将变得非常困难,传感器点的输出调试能力将给你最后的一线希望。
文章评论(0条评论)
登录后参与讨论