日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

OpenMP中的常用函数

發(fā)布時(shí)間:2023/12/14 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OpenMP中的常用函数 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1、設(shè)置線程數(shù)目

其定義如下:

void omp_set_num_threads(int num_threads);

通過該函數(shù)來指定其后用于并行計(jì)算的線程數(shù)目,其中參數(shù)num_threads就是指定的線程數(shù)目。

2、獲取線程數(shù)目

其定義如下:

int omp_get_num_threads();

通過該函數(shù)可以獲取當(dāng)前運(yùn)行組中的線程數(shù)目,如果是在并行結(jié)構(gòu)中使用該函數(shù),其返回的就是現(xiàn)在并行計(jì)算中的所有的線程總數(shù),如果是在串行中使用該函數(shù),其返回值就為1。

3、獲取最多線程數(shù)目

其定義如下:

int omp_get_max_threads();

該函數(shù)將返回最多可以用于并行計(jì)算的線程數(shù)目。

4、返回線程ID

其定義如下:

int omp_get_thread_num();

通過該函數(shù)可以返回當(dāng)前線程的ID,如果使用該函數(shù)時(shí)處于并行結(jié)構(gòu)中,它返回的就是這個(gè)并行線程的ID,如果在串行中,就是返回主線程的ID。

5、獲取程序可用的處理器數(shù)目

其定義如下:

int omp_get_num_procs();

該函數(shù)將返回可用于程序的處理器數(shù)目(其實(shí)是線程數(shù)目)。

6、獲取時(shí)間

其定義如下:

double omp_get_wtime();

該函數(shù)返回為時(shí)鐘運(yùn)行的時(shí)間,單位為s,如果現(xiàn)在時(shí)刻為11:40:30.8,則該值為11*3600+40*60+30.8=42030.8。在程序運(yùn)行開始和即將結(jié)束時(shí)使用調(diào)用這個(gè)函數(shù)可以用于計(jì)算程序運(yùn)行的時(shí)間。

7、是否處于并行中

其定義如下:

int omp_in_parallel();


omp_set_dynamic 函數(shù)

omp_set_dynamic?功能啟用或禁用線程數(shù)動(dòng)態(tài)調(diào)整可用于并行區(qū)域的執(zhí)行。?格式如下所示:

#include <omp.h> void omp_set_dynamic(int dynamic_threads);

如果?dynamic_threads?計(jì)算為非零值,對(duì)于執(zhí)行后續(xù)并行區(qū)域使用線程的數(shù)目可能由種運(yùn)行時(shí)環(huán)境自動(dòng)調(diào)整以最佳利用系統(tǒng)資源。?因此,用戶指定的線程的數(shù)目最大線程計(jì)數(shù)。?線程數(shù)在執(zhí)行并行區(qū)域的團(tuán)隊(duì)保持固定為該并行區(qū)域的持續(xù)時(shí)間以及由?omp_get_num_threads?函數(shù)報(bào)告。

如果?dynamic_threads?計(jì)算結(jié)果為 0,動(dòng)態(tài)調(diào)整被禁用。

該函數(shù)具有中描述的效果頂部,在調(diào)用從?omp_in_parallel?函數(shù)返回零程序的一部分。?如果從?omp_in_parallel?函數(shù)返回非零值程序的一部分調(diào)用,此功能的行為未定義。

為?omp_set_dynamic?的調(diào)用在?OMP_DYNAMIC?環(huán)境變量的優(yōu)先級(jí)。

線程的動(dòng)態(tài)調(diào)整的默認(rèn)實(shí)現(xiàn)中定義。?因此,依賴于線程的特定數(shù)字正確執(zhí)行的用戶代碼應(yīng)顯式禁用動(dòng)態(tài)線程。?不需要實(shí)現(xiàn)能夠動(dòng)態(tài)地調(diào)整線程數(shù),但是,要求他們提供接口以便支持在所有平臺(tái)上的可移植性。


總體來說,調(diào)用omp_set_dynamic會(huì)覆蓋OMP_DYNAMIC環(huán)境變量的設(shè)置,其參數(shù)是一個(gè)int類型,這也是這個(gè)函數(shù)容易讓人誤解的地方之一。其實(shí),其參數(shù)也是一個(gè)"bool"類型,和OMP_DYNAMIC的功能是一樣的,上面的MSDN描述可知,如果參數(shù)為非零值,線程組線程數(shù)量也是根據(jù)系統(tǒng)的資源狀態(tài)動(dòng)態(tài)調(diào)整的,當(dāng)然,在線程組執(zhí)行一個(gè)并行區(qū)域的時(shí)候,其線程數(shù)量是固定的(fixed),這也是對(duì)“動(dòng)態(tài)”容易造成的誤解,所以,“動(dòng)態(tài)調(diào)整“并不是表示并行塊執(zhí)行的過程中會(huì)動(dòng)態(tài)變化線程組線程數(shù)量,而是在設(shè)置了”動(dòng)態(tài)“之后,接下里的并行區(qū)域會(huì)根據(jù)系統(tǒng)的當(dāng)前狀況進(jìn)行判斷來分配合理的線程數(shù)量

omp_get_dynamic函數(shù)用于獲取是否允許動(dòng)態(tài)調(diào)整,其返回值為int類型,但是實(shí)際只會(huì)返回0和1兩個(gè)值之一。

(PS:不知道為什么openmp不規(guī)定omp_set_dynamic的參數(shù)類型為bool,可能是C里面沒有bool類型的原因?)

(3)例子:

[cpp]?view plaincopy
  • #include?<omp.h>??
  • ??
  • int?main(int?argc,?_TCHAR*?argv[])????
  • {??
  • ????omp_set_dynamic(0);?//?can?be?ignored!??
  • ??
  • ????printf("Is?Dynamic:?%d\n",omp_get_dynamic());??
  • ??
  • ????omp_set_num_threads(10);??
  • #pragma?omp?parallel?num_threads(5)??
  • ????{??
  • ????????printf("ID:?%d,?Max?threads:?%d,?Num?threads:?%d?\n",omp_get_thread_num(),?omp_get_max_threads(),?omp_get_num_threads());??
  • ????}??
  • ??
  • ????omp_set_dynamic(1000);??//?nonzero?is?OK!??
  • ??
  • ????printf("Is?Dynamic:?%d\n",omp_get_dynamic());??
  • ??
  • ????omp_set_num_threads(10);??
  • #pragma?omp?parallel?num_threads(5)??
  • ????{??
  • ????????printf("ID:?%d,?Max?threads:?%d,?Num?threads:?%d?\n",omp_get_thread_num(),?omp_get_max_threads(),?omp_get_num_threads());??
  • ????}??
  • ??
  • ????return?0;????
  • }??
  • 分析上面的程序,來理解設(shè)置動(dòng)態(tài)和不設(shè)置的差別,在4核CPU上運(yùn)行的結(jié)果如下:


    總結(jié)

    以上是生活随笔為你收集整理的OpenMP中的常用函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。