为什么在测量针对循环和编译器优化而并行化的OpenMP的执行时间时std :: chrono不起作用?

问题描述 投票:0回答:1

我有一个简单的代码:

#include <iostream>
#include <chrono>

int main(int argc, char ** argv)
{
  int I=0;
  double time=0.0;
  for(int i=0; i<10; ++i)
  {
    auto begin1=std::chrono::steady_clock::now();
  #pragma omp parallel for simd
    for(int j=0; j<1000000; ++j) I=j;
    auto end1=std::chrono::steady_clock::now();
    auto timei=std::chrono::duration_cast<std::chrono::milliseconds>(end1-begin1).count();
    std::cout<<"time 1:"<<time<<std::endl;
    time+=timei;
    std::cout<<"time 2:"<<time<<std::endl;
  }
  return 0;
}

使用g ++ 5.3.1并编译行:

cmake . -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ -DCMAKE_CXX_FLAGS="-O2 -fopenmp"

但是输出是:

time 1:0
time 2:11
time 1:11
time 2:16
time 1:16
time 2:16
time 1:16
time 2:16
time 1:16
time 2:16
time 1:16
time 2:16
time 1:16
time 2:16
time 1:16
time 2:16
time 1:16
time 2:16
time 1:16
time 2:16

[你看,我不能使用std :: chrono!]正确地衡量执行时间。

为什么?到底是怎么回事?如何衡量执行时间?

这是针对“ -O2”和“ -O1”编译器优化标志的。使用“ -O0”,一切正常。为什么?

相同的情况是当我使用英特尔编译器icpc 19.0.1.144和编译行时:

cmake .-DCMAKE_C_COMPILER=icc -DCMAKE_CXX_COMPILER=icpc -DCMAKE_CXX_FLAGS="-march=native -mtune=native -O2 -ipo16 -mcmodel=large"

如果使用“ -O2”和“ -O1”编译器标志,则无法正确测量时间,但是如果将其替换为“ -O0”,则std :: chrono可以正常工作。

坦白地说,我很震惊。

但是问题是相同的:为什么使用std :: chrono的执行时间测量在此处不能与“ -O1”和“ -O2”一起正常工作,而与“ O0”一起工作?以及如何正确衡量这段代码的执行时间?

我有一个简单的代码:#include #include int main(int argc,char ** argv){int I = 0;双倍时间= 0.0; for(int i = 0; i <10; ++ i){auto begin1 = std :: chrono :: ......>

] >>
c++ g++ openmp compiler-optimization chrono
1个回答
2
投票

我的猜测是,编译器认为它无用,因此只是简单地优化了循环中的工作。使用以下代码,您将获得一些实际的ms:

#include <iostream>
#include <chrono>
#include <omp.h>

int main(int argc, char ** argv)
{
    int I=0;
    double time=0.0;
    for(int i=0; i<10; ++i)
    {
        auto begin1=std::chrono::steady_clock::now();
        #pragma omp parallel for simd
        for(int j=0; j<100000000; ++j) I+=j;
        auto end1=std::chrono::steady_clock::now();
        auto timei=std::chrono::duration_cast<std::chrono::milliseconds>(end1-   begin1).count();

        std::cout << I << std::endl;
        std::cout<<"time 1:"<<time<<std::endl;    
        time+=timei;
        std::cout<<"time 2:"<<time<<std::endl;
    }
    return 0;
}

我得到以下输出:

887459712
time 1:0
time 2:71
1774919424
time 1:71
time 2:142
-1632588160
time 1:142
time 2:213
-745128448
time 1:213
time 2:283
142331264
time 1:283
time 2:351
1029790976
time 1:351
time 2:419
1917250688
time 1:419
time 2:487
-1490256896
time 1:487
time 2:555
-602797184
time 1:555
time 2:623
284662528
time 1:623
time 2:692
© www.soinside.com 2019 - 2024. All rights reserved.