進(jìn)入多核時(shí)代后,必須使用多線程編寫程序才能讓各個(gè)CPU核得到利用。在單核時(shí)代,通常使用操作系統(tǒng)提供的API來(lái)創(chuàng)建線程,然而,在多核系統(tǒng)中,情況發(fā)生了很大的變化, 如果仍然使用操作系統(tǒng)API來(lái)創(chuàng)建線程會(huì)遇到一些問(wèn)題。具體來(lái)說(shuō),有以下三個(gè)問(wèn)題:
1)CPU核數(shù)擴(kuò)展性問(wèn)題
多
核編程需要考慮程序性能隨CPU核數(shù)的擴(kuò)展性,即硬件升級(jí)到更多核后,能夠不修改程序就讓程序性能增長(zhǎng),這要求程序中創(chuàng)建的線程數(shù)量需要隨CPU核數(shù)變
化,不能創(chuàng)建固定數(shù)量的線程,否則在CPU核數(shù)超過(guò)線程數(shù)量上的機(jī)器上運(yùn)行,將無(wú)法完全利用機(jī)器性能。雖然通過(guò)一定方法可以使用操作系統(tǒng)API創(chuàng)建可變化
數(shù)量的線程,但是比較麻煩,不如OpenMP方便。
2)方便性問(wèn)題
在
多核編程時(shí),要求計(jì)算均攤到各個(gè)CPU核上去,所有的程序都需要并行化執(zhí)行,對(duì)計(jì)算的負(fù)載均衡有很高要求。這就要求在同一個(gè)函數(shù)內(nèi)或同一個(gè)循環(huán)中,可能也
需要將計(jì)算分?jǐn)偟礁鱾€(gè)CPU核上,需要?jiǎng)?chuàng)建多個(gè)線程。操作系統(tǒng)API創(chuàng)建線程時(shí),需要線程入口函數(shù),很難滿足這個(gè)需求,除非將一個(gè)函數(shù)內(nèi)的代碼手工拆成多
個(gè)線程入口函數(shù),這將大大增加程序員的工作量。使用OpenMP創(chuàng)建線程則不需要入口函數(shù),非常方便,可以將同一函數(shù)內(nèi)的代碼分解成多個(gè)線程執(zhí)行,也可以
將一個(gè)for循環(huán)分解成多個(gè)線程執(zhí)行。
3)可移植性問(wèn)題
目前各個(gè)主流操作系統(tǒng)的線程API互不兼容,缺乏事實(shí)上的統(tǒng)一規(guī)范,要滿足可移植性得自己寫一些代碼,將各種不同操作系統(tǒng)的api封裝成一套統(tǒng)一的接口。OpenMP是標(biāo)準(zhǔn)規(guī)范,所有支持它的編譯器都是執(zhí)行同一套標(biāo)準(zhǔn),不存在可移植性問(wèn)題。
綜上所述,在多核編程中,使用OpenMP就很有必要,下面列出以前發(fā)表在我的CSDN博客中的OpenMP文章,供大家參考。
1、OpenMP并行程序設(shè)計(jì)(一)
介紹OpenMP程序在并行計(jì)算時(shí)的效率,在雙核CPU上效率增加了整整一倍。 閱讀全文
2、OpenMP并行程序設(shè)計(jì)(二)
1、fork/join并行執(zhí)行模式的概念 2、OpenMP指令和庫(kù)函數(shù)介紹 3、parallel 指令的用法 4、for指令的使用方法 5 sections和section指令的用法。閱讀全文
3、OpenMP中的數(shù)據(jù)處理子句
本文主要介紹了OpenMP中的private、firstprivate、lastprivate、threadprivate、reduction、copyin、copyprivate等數(shù)據(jù)處理子句的用法。 閱讀全文
4、OpenMP中的任務(wù)調(diào)度
本文主要介紹了OpenMP中任務(wù)調(diào)度子句schedule的使用方法。閱讀全文
5、OpenMP創(chuàng)建線程中的鎖及原子操作性能比較
主
要比較了原子操作,Windows CriticalSection,
OpenMP庫(kù)帶的鎖在單任務(wù)運(yùn)行情況下和多任務(wù)運(yùn)行情況下的性能情況,在多核CPU上,多任務(wù)的鎖競(jìng)爭(zhēng)花費(fèi)的時(shí)間是單任務(wù)時(shí)的鎖運(yùn)行花費(fèi)時(shí)間的18倍。
鎖競(jìng)爭(zhēng)帶來(lái)的效率下降完全出乎意料之外,由此也可見(jiàn)多核編程和單核多線程編程是有很大區(qū)別的。 閱讀全文
6、OpenMP程序設(shè)計(jì)的兩個(gè)小技巧
講述了如何動(dòng)態(tài)設(shè)置線程數(shù)量以適應(yīng)硬件和軟件的擴(kuò)展性,如何將嵌套循環(huán)并行化的技巧。 閱讀全文
上面列出的這些OpenMP知識(shí),屬于初步的入門知識(shí),如果需要進(jìn)一步深入掌握OpenMP或者了解其實(shí)現(xiàn)原理,則需要看更多的參考文獻(xiàn)。下面列出我寫的《多核計(jì)算與程序設(shè)計(jì)》一書的第3章OpenMP程序設(shè)計(jì)中的參考文獻(xiàn),供需要深入掌握的人參考。其中的文獻(xiàn)【2】講解了OpenMP的實(shí)現(xiàn)原理。
【1】 Ananth Grama, Anshul Gupta,“并行計(jì)算導(dǎo)論”,張武等譯,機(jī)械工業(yè)出版社,2005.01
【2】 Barbara Chapman, “How OpenMP is Compiled ”,http://cobweb.ecn.purdue.edu/ParaMount/iwomp2008/documents/chapman-underthehood
【3】 Bruce McMillin等,“Parallel Algorithm Fundamentals and Analysis”,http://citeseer.ist.psu.edu/mcmillin93parallel.html
【4】 Common Language Infrastructure (CLI) Partitions I to VI http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-335.pdf
【5】 Introduction to OpenMP,A Directive-based API for Parallel Processing on Shared-memory Computers,http://scv.bu.edu/documentation/tutorials/OpenMP/
【6】 Michael J. Quinn, “MPI與OpenMP并行程序設(shè)計(jì)”,陳文光等譯,清華大學(xué)出版社,2004.10
【7】 Mitsuhisa Sato, Shigehisa Satoh, Kazuhiro Kusano and Yoshio Tanaka, “Design of OpenMP Compiler for an SMP Cluster”,
http://www.hpcs.is.tsukuba.ac.jp/~msato/pdplab/papers/ewomp99.pdf
【8】 MSDN幫助材料
ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.chs/dv_vclang/html/652414c5-78ed-4b7f-8283-1a9fe4c5e78d.htm
【9】 Omni OpenMP compiler, http://phase.hpcc.jp/omni/home.html.
【10】 OpenMP2.0規(guī)范 http://www.openmp.org/
【11】 OpenMP2.5規(guī)范 http://www.openmp.org/
【12】 OpenMP: Simple, portable, scalable SMP Programming, http://www.OpenMP.org.
【13】 Rudolf Eigenmann and Timothy G. mattson. “OpenMP tutorial, part 2: Advanced OpenMP.”, http://www.cise.ufl.edu/research/ParallelPatterns/sc01-omp-tut-advanced.ppt.
【14】 Ruud van der Pas ,“An Introduction Into OpenMP”,http://www.nic.uoregon.edu/iwomp2005/iwomp2005_tutorial_openmp_rvdp.pdf
【15】
Sanjiv Shah, Grant Haab, Paul Petersen, & Joe Throop,“Flexible
Control Structures for Parallelism in
OpenMP”,http://www.it.lth.se/ewomp99/papers/grant.pdf
【16】 Shameem Akhter等,“多核程序設(shè)計(jì)技術(shù)-通過(guò)軟件多線程提升性能”,電子工業(yè)出版社,2007.03
【17】 Special issue on OpenMP and its applications. Scientific Programming, 11(2),2003.
【18】 Y. Charlie Hu, Honghui Lu, Alan L. Cox, and Willy Zwaenepoel. “OpenMP for networks of SMPs”,In Proceedings of 13th International Parallel Processing Symposium and 10th Symposium on Parallel and Distributed Processing, page 302-310. IEEE Computer Society, 1999.
多核編程相關(guān)文章:
1)用原子操作解決多線程退出問(wèn)題
2)原子操作在多核編程中的使用
3)多核編程偽共享問(wèn)題及其對(duì)策
4)多核編程鎖競(jìng)爭(zhēng)問(wèn)題及其對(duì)策
5)多核分布式隊(duì)列的實(shí)現(xiàn):“偷”與“自私”的運(yùn)用
6)多核編程中的條件同步模式
7)多核編程的四層境界
8)“老子”是偉大的多核計(jì)算科學(xué)家
9)程序員的十層樓(1~3層)
10)多核編程文章匯總
11)并行順序搜索及終止檢測(cè)