OpenMp 個人筆記(一)
阿新 • • 發佈:2018-11-11
1先來個HelloWorld
OpenMP是一個非常好用的並行程式設計的庫,在我們的Windows平臺上,只要下載了mingw(gomp)就可以使用了,可以說配置起來很方便,配合GCC來進行C語言的並行程式開發也是一件非常爽的事情啦。下面給出一個在網上找到的OpenMP的程式碼,並且用GCC編譯來看看效果如何。
Noname1.c程式碼:
#include <omp.h> #include <stdio.h> #include <stdlib.h> #include <time.h> void test() { int a=0; clock_t t1=clock(); for(int i=0;i<100000000;i++) { a=i+1; } clock_t t2=clock(); printf("Time = %d\n",t2-t1); } int main(int argc, char* argv[]) { clock_t t1=clock(); #pragma omp parallel for for(int j=0;j<2;j++) { test(); } clock_t t2= clock(); printf("Total time: %d\n",t2-t1); test(); return 0; }
編譯的命令列:
gcc -std=c99 -fopenmp Noname1.c -o hello.exe
pause
這裡要加上-fopenmp,-o可以指定輸出的檔名,預設的是a.exe。
在筆者的破機子上這個程式碼跑出來的結果是
time=600
time=690
totaltime=700
time=660
totaltime 是兩個test並行執行的時間,最後一個time是一個test執行的時間,可以看到這個效果還是不錯的。關鍵我們幾乎什麼都沒幹,只不過在for迴圈上加了一條類似註釋而已。因為筆者還要寫論文,靠著平行計算的名頭來忽悠畢業,所以還是先扯一點OpenMP的概念吧。
2 fork/join模式
openmp是的賣點是“共享式儲存”並行,筆者現在還不是非常明白她的運作機理。而所謂的fork/join模式是說要等並行程式執行完成之後才能執行後面的非並行部分,不知道這和fork,join有什麼關係? 相當於主執行緒建立的執行緒是不會和主執行緒一起並行執行的。