簡體   English   中英

openMP條件編譯指示“if else”

[英]openMP conditional pragma “if else”

我有一個for循環,可以使用schedule(static)schedule(dynamic, 10)具體取決於條件。 目前,我的代碼不是DRY(不要重復自己),為了適應以前的功能,它有以下重復:

boolean isDynamic; //can be true or false
if(isDynamic){
    #pragma omp parallel for num_threads(thread_count) default(shared) private(...) schedule(dynamic, 10)
    for(...){
        //for code inside
    }
}else{
    #pragma omp parallel for num_threads(thread_count) default(shared) private(...) schedule(static)
    for(...){
        //SAME for code inside, in fact, this is the EXACT same for as before
    }
}

閱讀完這些主題之后,我注意到openMP有一個#if(expression)編譯指示:

但是雖然我看到很多人遇到了我的問題,但似乎缺乏一般的解決方案。 最好的解決方案是將for循環的主體轉換為函數,然后調用函數,但這個解決方案對我來說還不夠好。

所以我想知道,OpenMP是否有#if(expression) else類型的pragma? 就像是:

#if(isDynamic )pragma omp parallel for num_threads(thread_count) default(shared) 
private(...) schedule(dynamic, 10) 
else 
pragma omp parallel for num_threads(thread_count) default(shared) 
private(...) schedule(static)

或者我被迫將我的for循環體放入一個單獨的函數並以這種方式調用它?

這是個有趣的問題。 基本上,您希望在運行時更改schedule策略。 據我所知,目前的OpenMP沒有這樣的指令。

我遇到了完全相同的問題。 正如你所提到的,我的解決方案最終使循環體成為一個函數。 否則,您需要使用丑陋的宏。

但是,我也嘗試使用schedule(runtime) ,它讀取環境變量OMP_SCHEDULE 所以,我在運行時更改了這個環境變量,但是沒有用。 這是因為OpenMP運行時只在開始時讀取此環境一次。 它可能是特定於實現的問題。 因此,其他實現可以即時讀取此環境變量。 你可以嘗試這種方法。

這已經晚了幾年,但對於這種特殊情況,您可以使用運行時庫在運行時設置計划。 它在OpenMP 4.5中的§3.2.12中定義:

void omp_set_schedule(omp_sched_t kind, int chunk_size);
typedef enum omp_sched_t {
    omp_sched_static = 1,
    omp_sched_dynamic = 2,
    omp_sched_guided = 3,
    omp_sched_auto = 4
} omp_sched_t;

對於您的情況,您所做的是:

/* wherever currently isDynamic is set */
if (isDynamic) {
    omp_set_schedule(omp_sched_dynamic, 10);
} else {
     /* chunk_size < 1 uses default */
    omp_set_schedule(static, 0);
}

/* later */
#pragma omp parallel for num_threads(thread_count) default(shared) private(...) schedule(runtime)
for (...) {
   /* do a thing */
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM