私はここに来たばかりで、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;
問題はまだそこにあります...