簡體   English   中英

OpenMP和C並行for循環:為什么我的代碼在使用OpenMP時會變慢?

[英]OpenMP and C parallel for loop: why does my code slow down when using OpenMP?

我是新手,也是C語言的初級程序員。我在使用openmp加速for循環方面遇到了一些問題。 以下是簡單的例子:

#include <stdlib.h>
#include <stdio.h>
#include <gsl/gsl_rng.h>
#include <omp.h>

gsl_rng *rng;

main()
{
int i, M=100000000;
double tmp;

/* initialize RNG */
gsl_rng_env_setup();
rng = gsl_rng_alloc (gsl_rng_taus);
gsl_rng_set (rng,(unsigned long int)791526599);

// option 1: parallel        
  #pragma omp parallel for default(shared) private( i, tmp ) schedule(dynamic)
  for(i=0;i<=M-1;i++){
     tmp=gsl_ran_gamma_mt(rng, 4, 1./3 );
  }


// option 2: sequential       
  for(i=0;i<=M-1;i++){
     tmp=gsl_ran_gamma_mt(rng, 4, 1./3 );
  }
}

代碼從M個迭代的伽馬隨機分布中提取。 事實證明,使用openmp(選項1)的並行方法大約需要1分鍾,而順序方法(選項2)只需要20秒。 使用openmp運行時,我可以看到CPU使用率為800%(我使用的服務器有8個CPU)。 系統是使用GCC 4.1.3的linux。 我正在使用的編譯命令是gcc -fopenmp -lgsl -lgslcblas -lm(我正在使用GSL)

難道我做錯了什么? 請幫我! 謝謝!

PS正如一些用戶所指出的,它可能是由rng引起的。 但即使我更換

tmp=gsl_ran_gamma_mt(rng, 4, 1./3 );

通過說

tmp=1000*10000;

問題仍然存在......

gsl_ran_gamma_mt可能會鎖定rng以防止並發問題(如果沒有,您的並行代碼可能包含競爭條件,從而產生錯誤的結果)。 然后解決方案是為每個線程創建一個單獨的rng實例,從而避免鎖定。

您的rng變量是共享的,因此線程花費所有時間等待能夠使用隨機數生成器。 為每個線程提供一個單獨的RNG實例。 這可能意味着使RNG初始化代碼也並行運行。

再次感謝大家的幫助。 我剛剛發現如果我擺脫了

schedule(dynamic)

在代碼中,問題消失了。 但那是為什么呢?

暫無
暫無

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

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