OpenMP多線程linux下的使用,簡單化


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM