1. 程式人生 > >OpenMp 個人筆記(一)

OpenMp 個人筆記(一)

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有什麼關係? 相當於主執行緒建立的執行緒是不會和主執行緒一起並行執行的。