Ⅰ 如何建立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();
}