我正在执行以下代码片段,如openMP教程中所述。但我看到的是,执行时间不会随着NUM_THREADS的变化而变化,实际上,执行时间只是不断变化。。我想知道我测量时间的方式是否错误。我尝试使用clock_gettime,但我看到了相同的结果。有人能帮忙吗。除了使用openMP缩短时间的问题外,我还不明白为什么报告的时间变化很大。
#include "iostream"
#include "omp.h"
#include "stdio.h"
double getTimeNow();
static long num_steps = 10000000;
#define PAD 8
#define NUM_THREADS 1
int main ()
{
int i,nthreads;
double pi, sum[NUM_THREADS][PAD];
double t0,t1;
double step = 1.0/(double) num_steps;
t0 = omp_get_wtime();
#pragma omp_set_num_threads(NUM_THREADS);
#pragma omp parallel
{
int i, id,nthrds;
double x;
id = omp_get_thread_num();
nthrds = omp_get_num_threads();
if(id==0) nthreads = nthrds;
for (i=id,sum[id][0]=0;i< num_steps; i=i+nthrds)
{
x = (i+0.5)*step;
sum[id][0] += 4.0/(1.0+x*x);
}
}
for(i=0, pi=0.0;i<nthreads;i++)pi += sum[i][0] * step;
t1 = omp_get_wtime();
printf("n value obtained is %fn",pi);
std::cout << "It took "
<< t1-t0
<< " secondsn";
return 0;
}
您使用openmp_set_num_threads()
,但它是一个函数,而不是编译器指令。您应该在没有#pragma
:的情况下使用它
openmp_set_num_threads(NUM_THREADS);
此外,您可以在编译器指令中设置线程数,但关键字不同:
#pragma omp parallel num_threads(4)
首选方法不是对程序中的线程数进行硬编码,而是使用环境变量OMP_NUM_threads。例如,在bash:中
export OMP_NUM_THREADS=4
但是,最后一个例子不适合您的程序。