2016-05-18 50 views
0

我需要使用openMP比較不同調度類型和線程數的循環執行時間。如何動態選擇排程類型?

我可以直接在編譯宏傳遞一個int變量動態設置線程數:

int threads_number = 4; 
#pragma omp parallel for num_threads(threads_number) 

但是我想對於schedule做同樣的,我需要比較staticdynamicguided類型。但它似乎不能使用int作爲枚舉,也不能使用char*作爲此名稱。

有什麼辦法可以動態地選擇它,還是我必須編寫循環3次,然後選擇使用if調用哪一個,這似乎很髒?

回答

3

當應用的計劃爲runtime時,您可以設置計劃種類。

當指定schedule(運行時)時,關於調度的決定被推遲到運行時。可以在運行時通過設置環境變量OMP_SCHEDULE來選擇組塊的計劃類型和大小。如果未設置此環境變量,則生成的計劃是實現定義的。當指定schedule(運行時)時,不能指定chunk_size。 - OpenMP-4.5 Specification

這是用函數來完成void omp_set_schedule(omp_sched_t kind, int chunk_size);

調度種可用在omp.h定義如下

typedef enum omp_sched_t { 
    omp_sched_static = 1, 
    omp_sched_dynamic = 2, 
    omp_sched_guided = 3, 
    omp_sched_auto = 4 
} omp_sched_t; 
+1

注意該枚舉,使用時間表(運行時),然後如果編譯器知道編譯時間表是靜態的,那麼omp_sched_static很容易產生比靜態調度更糟糕的結果。這是因爲如果編譯器知道時間表是靜態的,那麼它可以生成更好的代碼,這些代碼在循環內沒有任何對運行時進行調度的調用。而如果時間表可能是動態的,則它必須使用更昂貴的代碼生成模式,以針對每個「塊大小」的迭代集合進行調度。 –