OpenMp中的执行时间为零 double itime=omp_get_wtime(); 对于(int i=0;i

OpenMp中的执行时间为零 double itime=omp_get_wtime(); 对于(int i=0;i,openmp,Openmp,如果出于某种原因,代码调整了默认的iostream配置,则可以得到一个值0。最下面的代码演示了这一点。接下来的代码将为您提供有效的结果 运行有效的代码,我得到以下信息。正如赫里斯托所说,如果你添加优化标志(-O3),很多东西都会得到优化,但它不会给你一个完美的0 double itime = omp_get_wtime(); for (int i=0; i < x; i++) { cellx[i]=i*i; } for (int i = 0; i

如果出于某种原因,代码调整了默认的iostream配置,则可以得到一个值0。最下面的代码演示了这一点。接下来的代码将为您提供有效的结果

运行有效的代码,我得到以下信息。正如赫里斯托所说,如果你添加优化标志(-O3),很多东西都会得到优化,但它不会给你一个完美的0

double itime = omp_get_wtime();
    for (int i=0; i < x; i++) {
        cellx[i]=i*i;
    }

    for (int i = 0; i < y; i++) {
        celly[i]=i*i;
    }
    std::cout<<"execution time:"<<omp_get_wtime() - itime<<std::endl;
下面是我用来获得有意义结果的代码:

#包括
#包括
int main(){
常数int x=40000;
常数y=40000;
双细胞x[x];
双细胞[y];
double itime=omp_get_wtime();
对于(int i=0;istd::cout如果在
std::cout
语句之后不使用
cellx
celly
的值,编译器可以自由地优化循环,并且不为它们发出任何代码。即使不是这样,在现代CPU上,将整数增加80000倍和平方80000倍也需要大约100us。是的,但是我如果你检查omp_get_wtick(),它可能是1ns左右,因此微秒与分辨率相比是巨大的。默认情况下没有问题。我必须介绍一个可能发生这种情况的潜在原因告诉你,感谢添加std::cout后唯一可能的方法是如果omp_get_wtime()正在返回0.0这里有一篇帖子提到:我也添加了标题。但它仍然不起作用。
$ g++ test.cc -o test.exe -fopenmp
$ ./test.exe
execution time:0.00124655
$ g++ test.cc -o test.exe -fopenmp -O3
./test.exe
execution time:2.16998e-06
$ ./test.exe
execution time:0