Intel开发培训简要笔记
2007年04月21日 10:51
昨天参加了Intel的开发培训。我参加这个培训的主要目的是为了了解一些多核开发的技术。而这次培训主要的目的当然还是介绍Intel自己的一些开发产品,包括编译器、性能检测工具、并行调试工具和一些利用充分利用并行技术的计算函数库。不过到底还是介绍了一些我想了解的东西,下面就简要的记录一下。一、多核开发需要达到什么样的目标
正如以前的程序,在使用更高主频的CPU之后无需更改代码甚至重新编译就可以得到更快的运行速度一样。一个好的多核优化的应用程序,应该是可以自动充分利用多核的能力,自动根据内核数切分线程,在未来系统中内核数量增加的时候,无需改动代码甚至重新编译就可以利用更多内核增加并行数量得到更快的运行速度。
二、如何达到这个目标
并行开发有两种类型,一种是基于任务的并行,比如一个线程用于接受输入,一个线程用于拼写检查,一个线程用于定时保存,等等;另一种是基于数据的并行,比如用一个for循环求一个长度为1000的数组中所有数字的和,就可以被切分成0-499和500-999两段同时并行计算,最终将两段的结果相加得到最终结果。
基于任务的并行,因为任务是应用相关的,所以很难灵活调控它的数量;而基于数据的并行,是一个对用户透明的操作,可以根据实际情况灵活调整它的并发数量,具有很好的可扩展性。因此,对于多核的优化,主要是对基于数据的并行进行。在实际的开发中,往往采取两者混合的模型。
并行化的几个关键点:
- 找到可以并行化的部分,将其分割成合理数量的并行任务
- 合理的分配这些任务
- 建立对公共资源的私有拷贝
- 对确实无法私有化的资源做好同步工作
三、开发工具
对于基于C++的开发,主要有这样一些工具。
- OpenMP。这是一个工业化的标准,主要用于数据并行化,也可以用于任务并行化。它是平台无关的,对代码的改动尽可能的小。(实际上,它只是使用#pragma插入一些附加指令,对C代码本身原则上不需要改动)
- Intel Threading Building Blocks。这是Intel开发的一个基于模板技术的C++并行化库,它需要改动代码,但也是对任务的并行化做一些描述,而不需要在代码中显式创建线程。
- 显式线程。就是我们比较熟悉的Win32线程和Posix线程,他们主要是基于函数的,用在任务并行化上比较方便。
昨天的课上主要介绍的还是OpenMP。它是基于一个fork-join模型的,平时是一个主线程在跑,只有在必要的时候,才会fork出并行化的线程,然后主线程会等待他们都运行结束后继续往下走。OpenMp的用法实际上就是插入一些#pragma附加指令,比如#pragma omp parallel for之类,用来指示将特定的代码做并行化处理。并行化的工作是在运行期做的,所以它可以根据你的CPU实际情况开出合适的线程数量,充分利用多核的能力。
四、其他
昨天课上还介绍了对于并发程序的优化和调试。我对Intel自家的那个调试工具并不是十分感兴趣,不过我也意识到,并发程序的调试的确需要新的工具,以前的调试工具对于并发调试而言的确是太麻烦了。另外还有调优的工作,其实就是如何把工作充分并行化的问题。另外还有一些调优手段,涉及到CPU的工作模式,比如针对超线程CPU的分支预测所做的优化等等,这些我个人的感觉是太过了,非万不得已不会去用。
4条评论

希望像JAVA,PYTHON这些解释执行(类解释执行)的语言能在新版本中支持多核,哈哈
用普通的多线程能在多核下提高性能吗?我记得好像是多进程
像ORACLE,POSTGRE这些数据库都是多进程的,这样做有什么优势? 葛风华 - 2007年04月23日 10:40
多线程和多进程在CPU级别上是不予区分的。关键在编译器和操作系统是不是将任务分配给了多个内核。 令狐虫 (URL) - 2007年04月23日 11:54