利用VS的代码优化和openmp并行计算提高程序运行速度
生活随笔
收集整理的這篇文章主要介紹了
利用VS的代码优化和openmp并行计算提高程序运行速度
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
轉(zhuǎn)載:http://www.lai18.com/content/6954092.html?from=cancel
以前利用多線程為擁有較大量計算的程序提速過,但也深知多線程的同步和程序的調(diào)試是一大坑,最近為實(shí)驗(yàn)室的項(xiàng)目學(xué)習(xí)了一點(diǎn)VS下優(yōu)化代碼的設(shè)置以及利用openmp加速運(yùn)算,都是些很基本的提升程序速度的方法,只要稍微修改下代碼和設(shè)置,就可使程序加速。配合多線程,經(jīng)過clock()函數(shù)驗(yàn)證,我的程序運(yùn)行可提高60%的速度,詳細(xì)如下:
代碼優(yōu)化:
屬性->配置屬性->C/C++->代碼生成:啟用增強(qiáng)指令集,可選用 流式處理 SIMD 擴(kuò)展 2 (/arch:SSE2) (/arch:SSE2)、流式處理 SIMD 擴(kuò)展 2 (/arch:SSE2) (/arch:SSE2) 進(jìn)行加速浮點(diǎn)模型,可選用 快速 (/fp:fast) 進(jìn)行浮點(diǎn)數(shù)據(jù)運(yùn)算的加速屬性->配置屬性->C/C++->優(yōu)化:可選用 使速度最大化 (/O2) 進(jìn)行優(yōu)化。全程序優(yōu)化選擇是(/GL),在debug版本下不能這樣設(shè)置,必須在release版本
openmp并行計算:
在vs2012下,項(xiàng)目屬性-》C/C++-》語言,openmp支持,選是,包含頭文件“omp.h”,對基于數(shù)據(jù)分集的多線程程序設(shè)計,OpenMP是一個很好的選擇。OpenMP常用指令
parallel:用在一個代碼段之前,表示這段代碼將被多個線程并行執(zhí)行
for:用于for循環(huán)之前,將循環(huán)分配到多個線程中并行執(zhí)行,必須保證每次循環(huán)之間無相關(guān)性
parallel for:parallel 和 for語句的結(jié)合,也是用在一個for循環(huán)之前,表示for循環(huán)的代碼將被多個線程并行執(zhí)行
sections:用在可能會被并行執(zhí)行的代碼段之前
parallel sections:parallel和sections兩個語句的結(jié)合
critical:用在一段代碼臨界區(qū)之前
single:用在一段只被單個線程執(zhí)行的代碼段之前,表示后面的代碼段將被單線程執(zhí)行
barrier:用于并行區(qū)內(nèi)代碼的線程同步,所有線程執(zhí)行到barrier時要停止,直到所有線程都執(zhí)行到barrier時才繼續(xù)往下執(zhí)行
atomic:用于指定一塊內(nèi)存區(qū)域被制動更新
master:用于指定一段代碼塊由主線程執(zhí)行
ordered:用于指定并行區(qū)域的循環(huán)按順序執(zhí)行
threadprivate:用于指定一個變量是線程私有的
OpenMP除上述指令外,還有一些庫函數(shù),下面列出幾個常用的庫函數(shù):
omp_get_num_procs:返回運(yùn)行本線程的多處理機(jī)的處理器個數(shù)
omp_get_num_threads:返回當(dāng)前并行區(qū)域中的活動線程個數(shù)
omp_get_thread_num:返回線程號
omp_set_num_threads:設(shè)置并行執(zhí)行代碼時的線程個數(shù)
omp_init_lock:初始化一個簡單鎖
omp_set_lock:上鎖操作
omp_unset_lock:解鎖操作,要和omp_set_lock函數(shù)配對使用
omp_destroy_lock:omp_init_lock函數(shù)的配對操作函數(shù),關(guān)閉一個鎖
parallel指令用法
[cpp]?view plaincopy
printf函數(shù)被創(chuàng)建出的8個線程來執(zhí)行,每一個線程執(zhí)行的先后次序并不確定。和傳統(tǒng)的創(chuàng)建線程函數(shù)比起來,OpenMP相當(dāng)于為一個線程入口函數(shù)重復(fù)調(diào)用創(chuàng)建線程函數(shù)來創(chuàng)建線程并等待線程執(zhí)行完。如果在上面的代碼中去掉num_threads(8)來指定線程數(shù)目,那么將根據(jù)實(shí)際CPU核心數(shù)目來創(chuàng)建線程數(shù)。
for指令用法
[cpp]?view plaincopy
for循環(huán)的語句被分配到不同的線程中分開執(zhí)行了。需要注意的是,如果不添加parallel關(guān)鍵字,那么四次循環(huán)將會在同一個線程里執(zhí)行,必須循環(huán)之間無相關(guān)性,變量最好都定義在循環(huán)內(nèi)。
sections和section的用法
[cpp]?view plaincopy
每一個section內(nèi)部的代碼都是(分配到不同的線程中)并行執(zhí)行的。使用section語句時,需要注意的是這種方式需要保證各個section里的代碼執(zhí)行時間相差不大,否則某個section執(zhí)行時間比其他section長太多就達(dá)不到并行執(zhí)行的效果了。
總結(jié)
以上是生活随笔為你收集整理的利用VS的代码优化和openmp并行计算提高程序运行速度的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OFFICE | WORD VBA 合集
- 下一篇: 语言代号/地区代号/国家代号