私は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にスレッドの数を最適に選択させることをリサーチが示唆しています。
どのように使用するスレッド数を指定できないのですか?
本当に感謝しました! なぜ '#pragma omp num_threads(4)'がしなかったのか? 'OMP_DYNAMIC = true'のためですか?または、なぜ私は未使用の変数警告を得るのですか? – lemdan
'#pragma omp parallel'の前に置いてみましたか? –
それは実際に働いた。ほとんどのチュートリアルで同じことをしているように私にはおかしいと思う...最後に、なぜ未使用の変数警告が出るのかについての情報はありますか?シーケンシャル部分でも、私は明らかに配列を使います。 – lemdan