我有一个简单的代码:
#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
我的猜测是,编译器认为它无用,因此只是简单地优化了循环中的工作。使用以下代码,您将获得一些实际的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