[英]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.