OpenMP自學筆記(一) HelloWorld程式
并行計算已經成為計算科學研究和應用中的熱點,MPI、CUDA等有着廣泛的前景和應用。OpenMP較為簡單,作為并行計算的入門,了解相關概念和程式設計标準,是非常合适的。本人最近在學習并行計算/OpenMP的相關内容,整理出筆記供自己複習,也供大家的參考。
OpenMP編譯環境
OpenMP相對于MPI來講,要友好很多。
Windows環境下,不需要太多的配置,隻要安裝Visual Studio 2008以上,并在項目選項中開啟OpenMP的支援,就可以輕松使用。( 當然,MinGW也是支援的 )
Linux環境中,有GCC/G++即可使用OpenMP
在terminal中輸入:
g++ -fopenmp hello.o hello.cpp
./hello.o
注:GNU系列支援的OpenMP标準比VS更新。
(筆者用的系統是:Ubuntu 18.04)
Hello World程式
#include<iostream>
#include<omp.h>
using namespace std;
int main()
{
int tid; //代表線程号
omp_set_num_threads(4); //設定4個線程
/*并行區域開始*/
#pragma omp parallel private(tid)
{
tid=omp_get_thread_num();
cout<<"這是線程"<<tid<<endl;
cout<<"Hello World!"<<endl;
}
return 0;
}
第一個Hello World程式就完成了。并行區域由pragma編譯指導語句開始,private語句是該語句的子句。
但需要注意的是#pargma行不能有注釋,否則可能會報錯。
omp_get_thread_num() 來擷取程序号
列印程序号
列印Hello Wrold!
理想狀态下的輸出:
這是線程0
Hello World!
共輸出4個線程版本的Hello World。
實際情況,Hello World可能是亂序輸出的,因為程式并非按照0-1-2-3的順序串行,而是多線程同時執行相同的語句,輸出情況應該是随機的,或難以預測的,要想設計出完美的程式,就需要了解後續”資料環境“鎖”"格栅"等相關并行程式設計的概念。