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;
}
嗨!感謝你的回答,這是有道理的。我還有一個問題:是否立即執行其他任務創建的任務? – JohnTortugo
也許,但不能保證。 「遇到的線程可能會立即執行任務,或推遲執行任務,在後一種情況下,團隊中的任何線程都可能被分配任務。」 – Zulan
那麼,你認爲這是實施依賴嗎?或者有什麼想法如何決定? – JohnTortugo