我在taskloop构造中使用OpenMP task构造:

double compute(int input) {
  int array[4] = {0};
  double value = input;

  #pragma omp taskloop private(value)
  for(int i=0; i<5000000; i++) {
    // random computation, the result is not meaningful
    value *= std::tgamma(std::exp(std::cos(std::sin(value)*std::cos(value))));
    int tid = omp_get_thread_num();
    array[tid] ++;
  }

  for(int i=0; i<4; i++) {
    printf("array[%d] = %d ", i, array[i]);
  }
  printf("\n");

  return value;
}

int main (int argc, char *argv[]) {
  omp_set_nested(1);
  omp_set_num_threads(4);  // 4 cores on my machine

  #pragma omp parallel
  {
    #pragma omp single
    {
      #pragma omp task
      { compute(omp_get_thread_num()); }
    }
  }
 }

结果数组均为0。但是,如果我将taskloop更改为parallel for:
  #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] ++;
  }


那么每个索引的数组结果是1250000。我使用taskloop构造有什么问题吗?

最佳答案

通过@Cimbali的确认,看来您的问题是该数组未在线程之间共享。由于您没有明确声明变量数组是共享的或私有(private)的,因此OpenMP将根据其规则来确定它。与并行相比,任务具有特殊的数据共享属性。我找不到明确指定规则的任何内容。 This是我能找到的最好的。尝试指定默认子句,并共享数组变量。

关于c++ - 任务内部的OpenMP Taskloop,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59708332/

10-09 13:35