導航:首頁 > 編程語言 > openmp編程實例

openmp編程實例

發布時間:2022-09-05 02:28:53

Ⅰ 如何建立Openmp編程環境

OpenMP在Windows環境下比較容易實現,只要打開VS2008中的編譯選項/openmp,設置一下環境變數OMP_NUM_THREADS就可以了。
一般是新建一個c++項目,以次選擇Project -> (alt+f7)屬性 -> 配置屬性(configuration property) -> c/c++ -> 語言(Language),打開OpenMP支持;

設置環境變數:我的電腦 -> 屬性 -> 高級 -> 環境變數,新建一個OMP_NUM_THREADS變數,值設為2,即為程序執行的線程數。

至於其它環境變數,在使用的時候我們再設置就可以了,所以暫時不考慮。這樣,就可以進行OpenMP程序設計了。

測試例子1:

#include "omp.h"

int main(int argc, char* argv[])
{

#pragma omp parallel
for(;;)
{
int i = 0 ;
i++;
int y = i;
}
return 0;
}

可以在任務管理器中看到CPU跑到100%。

測試例子2:

#include <stdio.h>
#include <omp.h>

int main()
{

omp_set_num_threads(2);

#pragma omp parallel

printf("Hello from Thread NO.%d\n", omp_get_thread_num());

return 0;

}

程序運行結果為:
Hello from Thread NO.0
Hello from Thread NO.1

Ⅱ 在Linux進行C語言編程的時候,程序里使用了mpi或者openmp或者都使用了該怎麼進行編譯執行謝謝

mpi或者openmp
這個,你指的是庫?
如果是的話,編譯時,加上鏈接庫的編譯選項就可以。
比如 gcc -hello.c -o hello -lm -lxml -L/usr/local/lib -lts
-lm 鏈接了math庫
-lxml鏈接了xml庫
-L/usr/local/lib -lts 鏈接了ts庫,ts庫存在目錄/usr/local/lib中

Ⅲ 從並行計算的角度對比,MPI 與 OpenMP 有什麼區別

OpenMP和MPI是並行編程的兩個手段,對比如下:

OpenMP:線程級(並行粒度);共享存儲;隱式(數據分配方式);可擴展性差。

MPI:進程級;分布式存儲;顯式;可擴展性好。OpenMP採用共享存儲,意味著它只適應於SMP,DSM機器,不適合於集群。MPI雖適合於各種機器,但它的編程模型復雜。

需要分析及劃分應用程序問題,並將問題映射到分布式進程集合。需要解決通信延遲大和負載不平衡兩個主要問題。

延伸論述:

我認為,要理解OpenMP和MPI,首先要有一些操作系統知識和系統編程基礎——OpenMP對應的實際上是單進程多線程的並發編程模型,可以將一個單線程的程序按for循環拆分成多線程——相當於pthread_create。

對於同一個進程的多個線程來說,由於它們只是獨占自己的棧內存,堆內存是共享的,因此數據交換十分地容易,直接通過共享變數就可以進行交換,編程模型非常簡單易用,並且對於操作系統來說,線程的上下文切換成本也比進程低很多。

然而另一方面,由於線程不能脫離進程獨立存在,而一個進程不能存在於多台機器上,所以OpenMP只適用於擁有多個CPU核心的單台電腦。並且多線程編程存在臨界區(Critical Section),需要你自己去加鎖,解決Race Condition問題,否則的話很容易導致不可預知的後果。

而MPI則是多進程的並發編程模型,相當於你自己調用fork——每一個進程的內存地址空間都是獨立的,它們彼此之間幾乎什麼都不共享,只能通過進程間通信(IPC)來交換彼此的數據,因此編程難度明顯要大很多。

MPI有一個非常顯著的優點,那就是對於一個分布式系統來說,進程是可以在分布式系統的每一台電腦之間轉移的,因此對於擁有多台電腦的分布式系統來說,其並發性要明顯好於OpenMP。

Ⅳ 用openmp並行編程計算100的階乘

OpenMP:
#include <iostream>
#include <mpi.h>
int main( int argc, char** argv ){
int mynode, numnodes;
int sum, startval, endval, accum;
MPI::Status status;
MPI::Init( argc, argv );
numnodes = MPI::COMM_WORLD.Get_size();
mynode = MPI::COMM_WORLD.Get_rank();
sum = 0;
startval = 1000*mynode/numnodes+1;
endval = 1000*(mynode+1)/numnodes;

for( int i=startval; i<=endval; ++i ){
sum = sum + i;
}
if( mynode != 0 ){
MPI::COMM_WORLD.Send( &sum, 1, MPI::INT, 0, 1 );
}
else{
for( int j=1; j<numnodes; ++j ){
MPI::COMM_WORLD.Recv( &accum, 1, MPI::INT, j, 1,
status );
sum = sum + accum;
}
}
if( mynode == 0 )
std::cout << "The sum from 0 to 1000 is: " << sum
<< std::endl;
MPI::Finalize();
}

Ⅳ 用fortran語言進行高斯消去法的openmp的並行編寫,但是結果卻不正確,求解

並行程序段中,要求前後左右計算沒有關聯。
比如你要對屏幕上的任何一個點與字元A做異或運算,這些點的運算之間是沒有關聯的,這時你可以安排進行並行計算。

Ⅵ 在Linux系統上如何進行openmp多線程編程

多線程的使用主要是用來處理程序「在一部分上會阻塞」,「在另一部分上需要持續運行」的場合。一般是根據需求,可以用多線程,事件觸發,callback等方法達到。但是有一些方法是只有多線程能辦到的就只有用多線程或者多進程來完成。

Ⅶ 用OpenMP並行編程計算sum=1+2+3+.....N 用MPI並行編程計算sum=1+2+3+......N

OpenMP:

#include"omp.h"

constintN=100;

voidmain()
{
intsum=0;
#pragmaompparallelfor
for(inti=0;i<N;i++)
sum+=i;
print("Resultofadding1to%dis:%d",N,sum);
}

MPI:

#include<iostream>
#include<mpi.h>
intmain(intargc,char**argv){
intmynode,numnodes;
intsum,startval,endval,accum;
MPI::Statusstatus;
MPI::Init(argc,argv);
numnodes=MPI::COMM_WORLD.Get_size();
mynode=MPI::COMM_WORLD.Get_rank();
sum=0;
startval=1000*mynode/numnodes+1;
endval=1000*(mynode+1)/numnodes;

for(inti=startval;i<=endval;++i){
sum=sum+i;
}
if(mynode!=0){
MPI::COMM_WORLD.Send(&sum,1,MPI::INT,0,1);
}
else{
for(intj=1;j<numnodes;++j){
MPI::COMM_WORLD.Recv(&accum,1,MPI::INT,j,1,
status);
sum=sum+accum;
}
}
if(mynode==0)
std::cout<<"Thesumfrom0to1000is:"<<sum
<<std::endl;
MPI::Finalize();
}
閱讀全文

與openmp編程實例相關的資料

熱點內容
柱加密區構造要求 瀏覽:514
地板木龍骨標准跟加密區別 瀏覽:150
解壓放鬆的好地方河南 瀏覽:965
搜狗怎麼移動到文件夾 瀏覽:617
文件自動選擇到文件夾 瀏覽:794
贈送的app怎麼在ipad下載 瀏覽:508
頸椎解壓後神經恢復 瀏覽:849
怎麼看app訂閱扣費 瀏覽:314
linux系統的負載均衡 瀏覽:419
遇到挫折解壓視頻 瀏覽:778
什麼指令看伺服器運行負載 瀏覽:84
因碩智能門鎖卡片是加密的么 瀏覽:336
為什麼會伺服器不可用 瀏覽:290
wow宏命令設置 瀏覽:264
解壓神器一張紙折疊魔術球 瀏覽:23
怎麼樣可以取消加密軟體oppo 瀏覽:580
屏幕共享源碼哪家比較不錯 瀏覽:665
vb中雙擊命令按鈕 瀏覽:208
伺服器做了磁碟陣列怎麼重裝 瀏覽:606
邏輯加密ic卡能用嗎 瀏覽:884