2017-10-02 12 views
1

私はOpenMPとCを学び、簡単なプログラムにいくつか問題があります。Cとgcc omp_set_num_threads()のOpenMPは効果がありません

私は私のbashrcに次の環境変数を設定しています。ここ

define how many threads you want 
export OMP_NUM_THREADS=4 

#allow to switch number of threads 
export OMP_DYNAMIC=true 

#allow nested parallel regions 
export OMP_NESTED=true 

は、私が実行しようとしているプログラムです。

#include <stdio.h>  /* input, output */ 
#include <omp.h>  /* openMP library */ 
#include <time.h>  /* measure time */ 

#define N 100000000  // if sourcearray not static, I'll be overflowing the stack. 
         // > ~10^6 elements is a lot for most systems. 



void forloop(void); 


int 
main(void)  
{ 

    /* worksharing: for loop */ 
    forloop(); 

    return(0); 
} 

/*=============================================================*/ 
/*=============================================================*/ 

void forloop(void){ 
    /*do a for loop sequentially and in parallel; measure each times */ 


    printf("=====================\n"); 
    printf("FOR LOOP\n"); 
    printf("=====================\n\n"); 

    long i;  
    clock_t start, end; 
    double cpu_time_used; 

    static double sourcearray[N];  


    /*============*/ 
    /*measure time*/ 
    /*============*/ 

    start=clock(); 

    for (i=0; i<N; i++){ 
    sourcearray[i] = ((double) (i)) * ((double) (i))/2.2034872; 
    } 

    end = clock(); 
    cpu_time_used = ((double) (end - start))/CLOCKS_PER_SEC; 

    printf("Non-parallel needed %lf s\n", cpu_time_used); 




    /*===============*/ 
    /*parallel region*/ 
    /*===============*/ 

#pragma omp parallel 
    /*need to specify num_threads, when OMP_DYNAMIC=true to make sure 4 are used.*/ 
    { 
    omp_set_num_threads(4); 

    double starttime_omp, endtime_omp; 
    /*time measurement*/ 
    starttime_omp=omp_get_wtime(); 

    int procs, maxt, nt, id; 

    procs = omp_get_num_procs();  // number of processors in use 
    maxt = omp_get_max_threads();  // max available threads 
    nt = omp_get_num_threads(); 
    id = omp_get_thread_num(); 

    printf("num threads forloop %d from id %d, procs: %d, maxthrds: %d\n", nt, id, procs, maxt); 


#pragma omp for 
    for (i=0; i<N; i++){ 
     sourcearray[i] = ((double) (i)) * ((double) (i))/2.2034872; 
    } 


    endtime_omp = omp_get_wtime(); 
    cpu_time_used = ((endtime_omp - starttime_omp)) ; 

    } /* end parallel region */ 


} 

私は のgcc -gとのコードをコンパイル - Wall -fopenmp -o omp_worksharing.exe omp_worksharing.c

プログラムがコンパイルされ、わかりません。

omp_worksharing.c: In function ‘forloop’: 
omp_worksharing.c:78:17: warning: variable ‘sourcearray’ set but not used [-Wunused-but-set-variable] 
    static double sourcearray[N]; 

それが主な問題ではありません。

問題は、プログラムは4つのスレッドを開始していないということです。これが出力されます:私が代わりにomp_set_num_threads(4);

さえ奇妙#pragma omp num_threads(4)を使用するとき、私は時々#pragma omp num_threads(4)omp_set_num_threads(4); 3つのスレッドが開始されている時間のほとんどを、しかし両方を離れるとき

===================== 
FOR LOOP 
===================== 

Non-parallel needed 0.900340 s 
num threads forloop 3 from id 0, procs: 8, maxthrds: 4 
num threads forloop 3 from id 1, procs: 8, maxthrds: 4 
num threads forloop 3 from id 2, procs: 8, maxthrds: 4 

同じことが、私は、たまたま 4.私はいつ、なぜ、規則を見つけることができませんでしたが、OMP_DYNAMIC=trueがOpenMPにスレッドの数を最適に選択させることをリサーチが示唆しています。

どのように使用するスレッド数を指定できないのですか?

答えて

2

#pragma omp parallelで実際に使用する前にomp_set_num_threads(4);に電話してください。

+0

本当に感謝しました! なぜ '#pragma omp num_threads(4)'がしなかったのか? 'OMP_DYNAMIC = true'のためですか?または、なぜ私は未使用の変数警告を得るのですか? – lemdan

+0

'#pragma omp parallel'の前に置いてみましたか? –

+0

それは実際に働いた。ほとんどのチュートリアルで同じことをしているように私にはおかしいと思う...最後に、なぜ未使用の変数警告が出るのかについての情報はありますか?シーケンシャル部分でも、私は明らかに配列を使います。 – lemdan

関連する問題