Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是";“最后的”;“的条款;任务“;指令正确吗?_C++_Parallel Processing_Openmp - Fatal编程技术网

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));
  }
}