c++教程 如何利用VS的代碼優(yōu)化和openmp并行計(jì)算提高程序運(yùn)行速度?
如何利用VS的代碼優(yōu)化和openmp并行計(jì)算提高程序運(yùn)行速度?代碼優(yōu)化:屬性->配置屬性->C/C ->代碼生成:?jiǎn)⒂迷鰪?qiáng)指令集,可選用 流式處理 SIMD 擴(kuò)展 2 (/arch:SS
如何利用VS的代碼優(yōu)化和openmp并行計(jì)算提高程序運(yùn)行速度?
代碼優(yōu)化:
屬性->配置屬性->C/C ->代碼生成:?jiǎn)⒂迷鰪?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版本
MPI和OPENMP哪個(gè)簡(jiǎn)單?
openmp簡(jiǎn)單,修改現(xiàn)有的大段代碼也容易o(hù)penmp基本上只要在已有程序基礎(chǔ)上根據(jù)需要加并行語(yǔ)句,而mpi有時(shí)甚至需要從基本設(shè)計(jì)思路上重寫(xiě)整個(gè)程序,而且mpi調(diào)試也困難得多,涉及到局域網(wǎng)通信這一不確定的因素。當(dāng)然openmp雖然簡(jiǎn)單卻只能用于單機(jī)多CPU/多核并行,而mpi才是用于多主機(jī)超級(jí)計(jì)算機(jī)集群的強(qiáng)悍工具,當(dāng)然復(fù)雜。
怎么搭建OpenMp環(huán)境?
OpenMP在Windows環(huán)境下比較容易實(shí)現(xiàn),只要打開(kāi)VS2008中的編譯選項(xiàng)/openmp,設(shè)置一下環(huán)境變量OMP_NUM_THREADS就可以了。一般是新建一個(gè)c 項(xiàng)目,以次選擇Project -> (alt f7)屬性 -> 配置屬性(configuration property) -> c/c -> 語(yǔ)言(Language),打開(kāi)OpenMP支持;設(shè)置環(huán)境變量:我的電腦 -> 屬性 -> 高級(jí) -> 環(huán)境變量,新建一個(gè)OMP_NUM_THREADS變量,值設(shè)為2,即為程序執(zhí)行的線程數(shù)。至于其它環(huán)境變量,在使用的時(shí)候我們?cè)僭O(shè)置就可以了,所以暫時(shí)不考慮。這樣,就可以進(jìn)行OpenMP程序設(shè)計(jì)了。測(cè)試?yán)?:#include "omp.h"int main(int argc, char* argv[]) {#pragma omp parallel for() {int i = 0 i int y = i } return 0 }可以在任務(wù)管理器中看到CPU跑到100%。測(cè)試?yán)?:#include <stdio.h> #include <omp.h>int main() {omp_set_num_threads(2)#pragma omp parallelprintf("Hello from Thread NO.%dn", omp_get_thread_num())return 0}程序運(yùn)行結(jié)果為:Hello from Thread NO.0Hello from Thread NO.1
openmp內(nèi)部怎么實(shí)現(xiàn)多線程的?
OpenMP中任務(wù)調(diào)度主要針對(duì)并行的for循環(huán),當(dāng)循環(huán)中每次迭代的計(jì)算量不相等時(shí),如果簡(jiǎn)單地給各個(gè)線程分配相同次數(shù)的迭代,則可能會(huì)造成各個(gè)線程計(jì)算負(fù)載的不平衡,影響程序的整體性能。 動(dòng)態(tài)調(diào)度依賴于運(yùn)行時(shí)的狀態(tài)動(dòng)態(tài)確定線程所執(zhí)行的迭代,也就是線程執(zhí)行完已經(jīng)分配的任務(wù)后,會(huì)去領(lǐng)取還有的任務(wù)。由于線程啟動(dòng)和執(zhí)行完的時(shí)間不確定,所以迭代被分配到哪個(gè)線程是無(wú)法事先知道的。 當(dāng)不使用size 時(shí),是將迭代逐個(gè)地分配到各個(gè)線程。 當(dāng)使用size 時(shí),逐個(gè)分配size個(gè)迭代給各個(gè)線程。