具有OMP任务的特定用例。长话短说,某处存在比赛条件,我需要缩小问题范围。没有确切的代码,但是我有一个准系统代码,应该可以传达我想要做的事情的本质。只需要知道我的想法是否正确。这段代码可能不会清除我所看到的争用条件,但可以确认我知道发生了什么。
在我看来,这段代码正在并行运行两个while循环。因此,如果我使用8个线程运行此代码,则其中2个正在运行#pragma omp单循环,其余6个正在运行任务。
此外,当线程= 1时,代码也可以工作。
感谢Fam:)
int tid;
int N = 8;
double D = 0, X = 2, Y = 3, Z = 4;
double * W = WORK ARRAY OF SIZE N; // HELLO PSUEDO CODE.
#pragma omp parallel num_threads(N) {
#pragma omp single private(tid, ...) nowait {
while(condition1) {
if(condition1a) {
#pragma omp task {
// Task 1.
tid = omp_get_thread_num();
#pragma omp critical
D += W[tid]*X;
}
}
}
}
#pragma omp single private(tid, ...) nowait {
while(condition2) {
if(condition2a) {
#pragma omp task {
// Task 2a.
tid = omp_get_thread_num();
#pragma omp critical
D += W[tid]*Y;
}
} else if (condition2b) {
#pragma omp task {
// Task 2b.
tid = omp_get_thread_num();
#pragma omp critical
D += W[tid]*Z;
}
}
}
}
}