Openmp 执行时间不为';不管我是否增加线程数,我都不会改变

Openmp 执行时间不为';不管我是否增加线程数,我都不会改变,openmp,execution-time,Openmp,Execution Time,我正在执行openMP教程中解释的以下代码片段。但是我看到的是,执行时间并没有随着线程数的增加而改变,事实上,执行时间只是在不断地变化。我想知道我试图测量时间的方法是否是错误的。我尝试使用clock_gettime,但我看到了相同的结果。有谁能帮忙吗。除了使用openMP减少时间的问题外,我还对报告的时间变化很大感到困惑 #include "iostream" #include "omp.h" #include "stdio.h" double getTimeNow(); static long

我正在执行openMP教程中解释的以下代码片段。但是我看到的是,执行时间并没有随着线程数的增加而改变,事实上,执行时间只是在不断地变化。我想知道我试图测量时间的方法是否是错误的。我尝试使用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 %f\n",pi);
std::cout << "It took "
              << t1-t0
              << " seconds\n";

return 0;
}
#包括“iostream”
#包括“omp.h”
#包括“stdio.h”
双getTimeNow();
静态长步数=10000000;
#定义焊盘8
#定义NUM_线程1
int main()
{ 
int i,n读取;
双圆周率,和[NUM_THREADS][PAD];
双t0,t1;
双步长=1.0/(双)个步长;
t0=omp_get_wtime();
#pragma omp_set_num_threads(num_threads);
#pragma-omp并行
{
int i,id,nthrds;
双x;
id=omp_get_thread_num();
nthrds=omp_get_num_threads();
如果(id==0)nthreads=nthrds;
对于(i=id,和[id][0]=0;i对于(i=0,pi=0.0;i您使用
openmp\u set\u num\u threads()
,但它是一个函数,而不是编译器指令。您应该在不使用
pragma的情况下使用它:

openmp_set_num_threads(NUM_THREADS);
此外,您可以在编译器指令中设置线程数,但关键字不同:

#pragma omp parallel num_threads(4)
首选方法不是硬编码程序中的线程数,而是使用环境变量OMP_NUM_threads。例如,在bash中:

export OMP_NUM_THREADS=4

但是,最后一个示例不适合您的程序。

如何编译此示例?是否对OpenMP使用特殊标志(-fopenmp表示gcc,-OpenMP表示icc等)?是的,我在本例中添加了-fopenmp标志。omp_set_num_threads是一个函数,而不是一个编译器指令。您应该在它之前删除#pragma。非常感谢Andrey,我现在可以看到执行时间有很大的不同。我不知道如何接受您的评论作为答案。但您确实帮助我找到了问题。