C++ 是";“最后的”;“的条款;任务“;指令正确吗?
我试图理解如何使C++ 是";“最后的”;“的条款;任务“;指令正确吗?,c++,parallel-processing,openmp,C++,Parallel Processing,Openmp,我试图理解如何使任务的final子句真正起作用,我在链接中找到了下面的代码示例 #包括 #包括 #定义阈值5 整数fib(整数n) { int i,j; 如果(n调用final时发生的情况是,由此派生的任务不会从中生成新任务 发件人: [§2.10.1任务结构]当任务结构和最终子句表达式上存在最终子句时 计算为true时,生成的任务将是最终任务。所有任务构造 在执行最终任务期间遇到的问题将生成最终和包含的任务。注意 在任务构造的final子句表达式中使用变量会导致 在所有封闭结构中对变量的隐式引
任务
的final
子句真正起作用,我在链接中找到了下面的代码示例
#包括
#包括
#定义阈值5
整数fib(整数n)
{
int i,j;
如果(n调用final
时发生的情况是,由此派生的任务不会从中生成新任务
发件人:
[§2.10.1任务结构]当任务结构和最终子句表达式上存在最终子句时
计算为true时,生成的任务将是最终任务。所有任务构造
在执行最终任务期间遇到的问题将生成最终和包含的任务。注意
在任务构造的final子句表达式中使用变量会导致
在所有封闭结构中对变量的隐式引用
如果最终任务是:
强制其所有子任务成为最终包含任务的任务
其中包括的任务是:
一种任务,其执行顺序包括在生成任务区域中。
也就是说,包含的任务是未出错的,并由
遇到线
在您的情况下,这意味着:
如果在这个任务中满足了THREASHOLD
的要求,则会产生使用n-1
和n-2
生成的新任务,并且这些任务在进行递归调用时不会生成新任务,但仍然以“老式”函数调用方式调用函数。谢谢。我想问另一个问题。我如何理解如果我在final
子句中输入的用于检查阈值的变量应设置为firstprivate
或shared
?我的第一个猜测是,它取决于您所需的代码的其余部分。但是作为的一部分,if子句表达式和final子句表达式是在任务c之外的上下文中计算的在结构上,没有指定这些求值的顺序。
我假设您不使用shared,因为在求值时读取哪个值是不确定的
#include <stdio.h>
#include <omp.h>
#define THRESHOLD 5
int fib(int n)
{
int i, j;
if (n<2)
return n;
#pragma omp task shared(i) firstprivate(n) final(n <= THRESHOLD)
i=fib(n-1);
#pragma omp task shared(j) firstprivate(n) final(n <= THRESHOLD)
j=fib(n-2);
#pragma omp taskwait
return i+j;
}
int main()
{
int n = 30;
omp_set_dynamic(0);
omp_set_num_threads(4);
#pragma omp parallel shared(n)
{
#pragma omp single
printf ("fib(%d) = %d\n", n, fib(n));
}
}