簡體   English   中英

OpenMP Parallel用於在C中進行調度

[英]OpenMP Parallel for with scheduling in C

我想運行一個並行的,預定的(例如靜態/動態/引導)for循環,其中每個線程都有自己的一組變量,基於它們的thread-id。 我知道在並行pragma中聲明的任何變量都是私有的,但我不想在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'的值具有私有范圍。

您可以在#pragma指令中使用“private”這樣的子句:

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

如果我理解你的問題,應該這樣做。

我知道在並行pragma中聲明的任何變量都是私有的,但我不想在for循環的每次迭代中重新聲明變量。

將#pragma omp parallel分為兩個獨立的組件#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,但是:-)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM