我在這裏是一個新手,並且是C語言的初級程序員。我在使用openmp加速for循環時遇到了一些問題。下面是一個簡單的例子:OpenMP和C並行循環:爲什麼我的代碼在使用OpenMP時變慢?
#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)
我做錯了什麼?請幫幫我!謝謝!
P.S.正如一些用戶指出的那樣,這可能是由rng引起的。但是,即使我更換
tmp=gsl_ran_gamma_mt(rng, 4, 1./3);
通過說
tmp=1000*10000;
問題仍然存在......
你不應該讓你的循環變量是私人的 - OpenMP會照顧到這一點。我不知道這是否會影響執行,但你應該修復它並重新測試。 –
另外,請注意,tmp = 1000 * 10000可能會被編譯器優化到noop,這樣會扭曲您的時序。 –
你確定實際上有8個CPU嗎?它可能是一個超線程的四核? –