最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

自編教材分享:第九章—OpenMP編程簡介

2023-11-24 09:16 作者:先進編譯實驗室  | 我要投稿


OpenMP是什么

OpenMP是一種用于共享內存并行編程的多線程程序設計方案,適合在共享內存編程下的多核系統(tǒng)上進行并行程序設計。程序員在完成程序功能開發(fā)的基礎上,只需添加指導語句#pragma即可自動將串行執(zhí)行轉換為并行處理,當編譯器不支持OpenMP時,程序會忽略#pragma語句,按照串行順序執(zhí)行。OpenMP的使用降低了多核并行編程的難度,優(yōu)化人員可以更多地考慮算法本身,而非具體的并行實現(xiàn)細節(jié)。

Fork-Join模式:在并行區(qū)的開始位置建立多個線程,在并行區(qū)的結束位置自動合并線程,具體執(zhí)行方式為在串行區(qū)由主線程執(zhí)行代碼,當程序由串行區(qū)進入并行區(qū)后,主線程和派生出來的子線程共同執(zhí)行并行區(qū)內的代碼,當并行區(qū)代碼全部執(zhí)行完畢后合并子線程,由主線程繼續(xù)執(zhí)行位于并行區(qū)后的串行區(qū)代碼。

SPMD模式:在單個并行程序中按照線程號來匹配程序分支,不同線程分配不同的計算任務。在此模式下,整個線程組僅需一次創(chuàng)建和一次合并。并行執(zhí)行程序中的循環(huán)時,各線程分別執(zhí)行整個循環(huán)迭代的一部分,當?shù)g存在依賴關系時可以通過插入同步語句、線程間近鄰通信以及流水并行來維持正確性,此執(zhí)行模式下線程的控制開銷較小且程序性能較高。

OpenMP程序由指導語句、庫函數(shù)和環(huán)境變量三部分組成。其中,指導語句是串行程序實現(xiàn)并行化的橋梁,是編寫OpenMP程序的關鍵。庫函數(shù)的作用是在程序運行階段改變和優(yōu)化并行環(huán)境從而控制程序的運行。環(huán)境變量是庫函數(shù)中控制函數(shù)運行的一些具體參數(shù)。

OpenMP指導語句

指導語句中#pragma omp標識符是固定前綴,parallel for為指導命令,每條指導語句只能有一個指導命令。這里的parallel for是OpenMP規(guī)范中定義的復合指導命令,在指導命令parallel for之后的是與之配套的子句,功能是為并行區(qū)開啟4個線程和指定變量的屬性,除非有另外的限制,否則子句能夠按照任意順序進行排列。需要注意的是子句是可選項,有些指導命令沒有配套子句。續(xù)行符同樣也是可選項,表示指導語句還未結束需要在下一行中繼續(xù),可用于語句長度超過一行時的邏輯分割。最后加入換行符表明指導語句終止。

指導語句中的指導命令按照功能可分為并行控制類型、工作共享類型、線程同步類型和復合指導命令類型。并行控制類型指導命令的功能是構建并行區(qū),并創(chuàng)建線程組來并行執(zhí)行計算任務;工作共享類型指導命令的功能是將任務分配給各線程,工作共享指導命令不能創(chuàng)建新的線程,且必須位于并行區(qū)中;線程同步類型指導命令的功能是利用互斥鎖和事件通知的機制來控制線程的執(zhí)行順序,保證執(zhí)行結果的正確性。此外,OpenMP還提供了不同類型指導命令組成的復合指導命令。

并行控制類:parallel、simd

工作共享類:for、sections、task、single、target

線程同步類:barrier、master、critical、atomic、flush、ordered

復合指導命令類:parallel for、for simd、parallel sections

parallel和for是OpenMP程序編寫過程中最常用的指導命令,指導命令parallel在當前大括號修飾區(qū)域內創(chuàng)建一組指定數(shù)量的線程,構建一個并行區(qū),并為跨越串行區(qū)和并行區(qū)的同名變量配置屬性,一般與for、sections等指導命令配合使用。當線程執(zhí)行到parallel指導語句時會創(chuàng)建一個線程組并成為這個線程組中的主線程,線程組內線程數(shù)量由環(huán)境變量或運行時庫決定。需要注意的是,一個并行區(qū)必須是一個連續(xù)的結構,即不能跨越多個程序或者代碼文件。

for指導語句用來對循環(huán)結構進行并行處理,將循環(huán)的迭代計數(shù)器在線程組中進行共享以完成數(shù)據(jù)的并行,實現(xiàn)并行的前提是此循環(huán)結構已位于parallel指導語句構建的并行區(qū)內,否則以串行的方式執(zhí)行。

指導命令for與parallel可以組合為parallel for復合指導命令,parallel指導語句的功能是創(chuàng)建多個線程來分別執(zhí)行相同的任務,而parallel for指導語句必須使用在循環(huán)結構前,其功能是在構建并行區(qū)后將循環(huán)執(zhí)行的任務在多個線程之間分配,讓每一個線程各自負責其中的一部分循環(huán)迭代任務。

parallel 指導語句

for 指導語句

在將串行程序改為并行程序時,需要針對程序中的熱點問題即程序中耗時較多的代碼段進行改寫才能得到較大的加速收益,典型的熱點代碼段為循環(huán)結構,可以利用第三章中的程序性能測量工具查找程序中的耗時較多部分。經(jīng)測試,發(fā)現(xiàn)代碼9-3中矩陣乘法程序的熱點代碼段為三層循環(huán)嵌套,因此對該部分添加parallel for復合指導語句進行并行化改寫。

矩陣乘法程序中核心代碼共有三層循環(huán)嵌套,但并不是每層循環(huán)都可以添加并行指導語句parallel for達到程序加速的效果,如將指導語句parallel for添加在最內層循環(huán),則會帶來程序正確性的問題,因為最內層循環(huán)負責將矩陣A第i行的元素與對應矩陣B第j列的元素相乘后累加得到C[i][j],若將最內層并行會將這一計算任務分配給多個線程并行執(zhí)行,每個線程僅執(zhí)行部分行列乘積的累加,由于線程間執(zhí)行速度的不同會引發(fā)對C[i][j]的讀寫沖突,最終導致C[i][j]的結果錯誤。這里可以將并行指導語句添加至第二層或最外層循環(huán),這里先添加至第二層循環(huán)。


自編教材分享:第九章—OpenMP編程簡介的評論 (共 條)

分享到微博請遵守國家法律
义马市| 吴堡县| 郁南县| 新晃| 曲靖市| 崇文区| 灵璧县| 瑞安市| 无锡市| 宝清县| 扶绥县| 汽车| 蓝田县| 盘山县| 清原| 泰兴市| 墨竹工卡县| 亳州市| 宕昌县| 长宁县| 泌阳县| 措勤县| 蕉岭县| 科尔| 平利县| 双峰县| 闽清县| 永和县| 通海县| 武城县| 连州市| 芜湖市| 龙陵县| 建昌县| 达孜县| 金山区| 张北县| 台北县| 静海县| 栾城县| 延长县|