0

我想运行一个并行的计划(例如静态/动态/引导)for循环,其中每个线程都有自己的一组变量,基于它们的线程ID。我知道在并行编译指示中声明的任何变量都是私有的,但我不想在 for 循环的每次迭代中重新声明变量。

在我的具体情况下,每当一组生成坐标位于圆的内部或外部时,我都会计算以近似 pi。我正在使用 erand48(int[3] seed) 在每个线程中生成这些坐标,并通过为每个线程提供一组不同的“seed”值,我将获得更多种类的数字用于近似值(也是此模拟的要求)。

  long long int global_result = 0;
  int tID = omp_get_thread_num();
  int[3] seed;
  seed[0] = (((tid*tid + 15) * 3)/7);
  seed[1] = ((((tid + tid) * 44)/3) + 2);
  seed[2] = tid;
  int this_result = 0;
#   pragma omp parallel for num_threads(thread_count) schedule(runtime)
      for(i = 0; i < chunksize; i++){
        x = erand48(seed);
        y = erand48(seed);
        ((x*x+y*y)>=1)?(this_result++):;    
      }
#   pragma omp critical{
      global_result+= this_result;
    }

这是尽我所能代表我正在尝试做的事情。我希望 'this_result'、'tid' 和 'seed' 的值具有私有范围。

4

2 回答 2

1

我知道在并行编译指示中声明的任何变量都是私有的,但我不想在 for 循环的每次迭代中重新声明变量。

将#pragma omp parallel for 分成两个独立的组件#pragma omp parallel 和#pragma omp for。然后,您可以在并行但在循环之外声明局部变量。像这样的东西

int global_result = 0; 
#pragma omp parallel reduction(+:global_result)
{
    int tid = omp_get_thread_num();
    int seed = (((tid*tid + 15) * 3)/7);
// Typo, as commented below
//  #   pragma omp parallel for schedule(runtime)
//  What is intended!
#   pragma omp for schedule(runtime)
      for(i = 0; i < chunksize; i++){
        float x = erand48(&seed);
        float y = erand48(&seed);
        if ((x*x+y*y)>=1)
            this_result++;    
      }
      global_result += this_result;
}

不过,有更好的方法来计算 pi:-)

于 2014-03-13T11:31:42.417 回答
1

您可以像这样在#pragma 指令中使用“private”子句:

#pragma omp parallel for private(this_result, tid, seed) num_threads(thread_count) schedule(runtime)

如果我正确理解了您的问题,那应该可以。

于 2014-03-12T12:39:24.180 回答