2016-07-11 67 views
2

我正在爲OpenMP的一個非常小的子集實現運行時庫,並且我陷入了Task和Taskwait構造的語義。OpenMP任務和Taskwait構造

爲了便於理解,我創建了下面的代碼示例。其中,系統是否應該進入鎖定狀態?對於'task2'任務等待消耗'task1'任務產生的數據,然而'task1'對於所有孩子完成的任務是「taskwaiting」?當我用GOMP和Intel OMP試用這個片段時,程序正常結束執行。

#include <stdio.h> 
#include <math.h> 
#include <omp.h> 
#include <time.h> 
#include <cstdlib> 

int result; 

void task2(int* res) { 
    printf("Task2... %p\n", res); 

} 

void task1(int* res) { 
    printf("Task1... %p\n", &result); 

    #pragma omp task depend(in:result) 
    task2(&result); 

    #pragma omp taskwait 
    printf("Task1 finishing...\n"); 
} 

int main() { 
    int res = 0; 

    #pragma omp parallel 
    #pragma omp single 
    { 
     printf("Res addr = %p\n", &result); 

     #pragma omp task depend(inout:result) 
     task1(&result); 
    } 

    return 0; 
} 

回答

2

task depend條款僅適用於兄弟姐妹任務。在這種情況下,task2不是兄弟姐妹,而是task1的子任務。

引用的OpenMP 4.5的相關部分:

[2.13.9]對於依賴型,如果 列表項的至少一個的存儲位置是相同的列表項 的存儲位置中出現的一個INOUT依賴型一個task 構建fr的列表其中兄弟任務先前已生成,那麼生成的任務將是該兄弟任務的相關任務。

+0

嗨!感謝你的回答,這是有道理的。我還有一個問題:是否立即執行其他任務創建的任務? – JohnTortugo

+0

也許,但不能保證。 「遇到的線程可能會立即執行任務,或推遲執行任務,在後一種情況下,團隊中的任何線程都可能被分配任務。」 – Zulan

+0

那麼,你認爲這是實施依賴嗎?或者有什麼想法如何決定? – JohnTortugo