我目前正在尝试使用虚拟循环样本来解决openmp问题。我发现奇怪的是编译器可能修剪了一些代码并且时间成本结果并不像预期的那样。这是真的,即使我不导入任何openmp事物。
我的测试很简单。虚拟循环,看看需要多长时间。
float duration;
clock_t start=clock();
long lasting=9999999;
long iter1;
long sum=0;
for(iter1=1;iter1<lasting;iter1++)
{
sum=iter1*10;
}
clock_t finish=clock();
//cout<<sum<<endl;
duration = (float)(finish - start) / CLOCKS_PER_SEC;
printf( "%f seconds\n", duration );
这需要0.0000秒,我认为循环内的代码不会执行。只要我取消注释cout<<sum<<endl;
,就会显示0.006秒。
编译器是否修剪了代码并且没有执行输出不需要/有用的东西?我使用带有标准项目设置的visual studio 2010运行此程序。
答案 0 :(得分:3)
当然可以!在运行测试时,确保实际使用循环中生成的数据至关重要。这称为dead code elimination,是众所周知的编译器优化之一。
另外,请注意您的循环可以简单地并行化,因为它没有任何数据依赖性。您的编译器也能够并行化循环(以及许多其他循环优化,如展开),就像这样,甚至更复杂的循环。如果要测量“纯”性能,则需要使用控制自动优化的必要编译器标志。