http://hi.baidu.com/diwulechao/item/bc6d865c411b813c32e0a932
http://www.cnblogs.com/yangyangcv/archive/2012/03/23/2413335.html
http://blog.sina.com.cn/s/blog_66474b160100z15b.html
這三篇文章已經講的很好。
關鍵語法:
#inlcude <omp.h> #pragma omp parallel for #pragma omp for reduction(+: 變量) #pragma omp critical//鎖 { } #pragma omp parallel for private(x,y)//每個線程都獨立拷貝x, y變量,互不干擾,如果不設默認是共享變量 #pragma omp parallel for schedule(static/dynamic/guided, k)//總工作量划分成n/k塊,再多線程調度 #pragma omp parallel sections { #pragma omp section//要保證幾個section下的函數之間沒有變量依賴 ......... #pragma omp section ......... } #pragma omp parallel { .......(); #pragma omp master/single //保證只有主線程/某個線程能訪問下面的函數,區別是使用master沒有barrier珊障,single的話先完成的線程等待沒完成的線程 { } ....... } #pragma omp barrier/nowait //強制設置珊障/無需等待,如果后續函數對前面的多線程沒有依賴,即可使用nowait #pragma omp parallel for firstprivate(變量)/lastprivate(變量) //為每個多線程賦初值/出多線程回到主線程時賦值供主線程使用
還有就是OpenMP的API:
int omp_get_num_threads(); //獲取當前使用的線程個數 int omp_get_num_threads(2/3/...)//設置要使用的線程個數 nt omp_get_thread_num(void);//返回當前線程號 int omp_get_num_procs(void);//返回可用的處理核個數
-------------------------------------------------------------------------------------------------------------------------
ubuntu下,無需加<omp.h>頭文件,只需在編譯的時候增添-fopenmp即可。
例如:emacs操作命令如下
emacs omp.c #include <stdio.h> int main() { int rank, size; #pragma omp parallel num_thread(3) private(rank) //num_threads用來控制線程數量
//或者使用omp_set_num_threads(3);
{ rank = omp_get_thread_num(); size = omp_get_num_threads(); printf("using %d of %d now.\n", rank, size); } return 0; } ctrl+x s alt+x compile gcc -fopenmp -o omp omp.c alt+shift+1 ./omp