C++ OpenMP任务循环内部任务

C++ OpenMP任务循环内部任务,c++,task,openmp,parallel-for,C++,Task,Openmp,Parallel For,我在任务构造中使用OpenMP任务循环构造: double计算(int输入){ int数组[4]={0}; 双值=输入; #pragma omp taskloop private(值) 对于(int i=0;i经@Cimbali确认,您的问题似乎是数组没有在线程之间共享。由于您没有明确表示变量数组是共享的或私有的,OpenMP将根据其规则确定它。与并行任务相比,任务有一个特殊的数据共享属性。我找不到任何指定明确指定规则。这是我能找到的最好的方法。请尝试指定一个默认子句,并确保数组变量是共享的。好

我在
任务
构造中使用OpenMP
任务循环
构造:

double计算(int输入){
int数组[4]={0};
双值=输入;
#pragma omp taskloop private(值)

对于(int i=0;i经@Cimbali确认,您的问题似乎是数组没有在线程之间共享。由于您没有明确表示变量数组是共享的或私有的,OpenMP将根据其规则确定它。与并行任务相比,任务有一个特殊的数据共享属性。我找不到任何指定明确指定规则。这是我能找到的最好的方法。请尝试指定一个默认子句,并确保数组变量是共享的。

好吧,通过@Cimbali的确认,您的问题似乎是数组没有在线程之间共享。由于您没有明确表示变量数组是共享的或私有的,OpenMP将通过它的规则。与parallel for相比,Tasks有一个特殊的数据共享属性。我找不到任何明确指定规则的内容。这是我能找到的最好的方法。请尝试指定默认子句并共享数组变量。

根据这一预期行为:

在任务生成构造中,如果不存在default子句,则上述规则未确定数据共享属性的变量为firstprivate

顺便说一句:始终建议使用默认值(无),您将被迫明确定义数据共享规则。

根据这是预期的行为:

在任务生成构造中,如果不存在default子句,则上述规则未确定数据共享属性的变量为firstprivate


顺便说一句:始终建议使用默认值(无),您将被迫显式定义数据共享规则。

可能尝试显式声明该数组是共享的。我认为它可能不起作用的原因只有两个。函数可能没有运行,或者有一个数组副本正在修改。我以前没有使用过任务,但它们似乎已经使用过特殊的数据共享。您的omp实现可能使用
shared(无)
为默认值。尝试在每次迭代中打印
数组
基址,查看它是否与原始基址不同adress@Warpstar22这确实是错误的。你应该把它写下来作为一个答案。@Tes在不初始化它的情况下将
值设置为private也是错误的,即使你不在这里使用该结果。也许可以尝试解释一下我只是说数组是共享的。我认为只有两个原因说明它可能不工作。函数可能没有运行,或者数组的副本正在被修改。我以前没有使用过任务,但它们似乎有特殊的数据共享。也许您的omp实现使用了
shared(none)
为默认值。尝试在每次迭代中打印
数组
基址,查看它是否与原始基址不同adress@Warpstar22这确实是错误的。你应该把它写下来作为一个答案。@Tes在没有初始化它的情况下将
值设置为私有也是错误的,即使你在这里没有使用这个结果。
  #pragma omp parallel for private(value)
  for(int i=0; i<5000000; i++) {
    value *= std::tgamma(std::exp(std::cos(std::sin(value)*std::cos(value))));
    int tid = omp_get_thread_num();
    array[tid] ++; 
  }