相关疑难解决方法(0)

精确的时间测量

我在C++中使用time.h来测量函数的时间.

clock_t t = clock();
someFunction();
printf("\nTime taken: %.4fs\n", (float)(clock() - t)/CLOCKS_PER_SEC);
Run Code Online (Sandbox Code Playgroud)

但是,我总是把时间花在0.0000上.clock()和t单独打印时,具有相同的值.我想知道是否有办法在C++中精确测量时间(可能是纳秒级).我正在使用VS2010.

c++ visual-studio-2010 ctime c++-chrono

45
推荐指数
3
解决办法
7万
查看次数

std :: chrono :: high_resolution_clock的用途是什么?

起初我认为它可以用于性能测量.但它std::chrono::high_resolution_clock可能是不稳定(is_steady可能false).据说std::chrono::high_resolution_clock甚至可能是别名std::chrono::system_clock通常不稳定.所以我无法用这种类型的时钟来测量时间间隔,因为在任何时刻都可以调整时钟并且我的测量结果是错误的.

同时我无法将时间点转换std::chrono::high_resolution_clock为日历时间,因为它没有to_time_t方法.所以我也无法用这种类型的时钟获得实时.

那可以std::chrono::high_resolution_clock用什么呢?

c++ time clock c++11 c++-chrono

15
推荐指数
1
解决办法
1527
查看次数

std::chrono::clock,硬件时钟和周期计数

std::chrono提供几个时钟来测量时间。同时,我猜 cpu 评估时间的唯一方法是计数周期。

问题 1: cpu 或 gpu 是否可以通过计数周期来评估时间?

如果是这样的话,因为计算机计数周期的方式永远不会像原子钟那样精确,这意味着period = std::ratio<1>计算机的“秒”()实际上可能比实际秒更短或更大,从而导致在长时间运行计算机时钟和 GPS 之间的时间测量。

问题2:正确吗?

某些硬件具有不同的频率(例如空闲模式和 Turbo 模式)。在这种情况下,这意味着循环数将在一秒钟内发生变化。

问题 3: cpu 和 gpus 测量的“周期数”是否因硬件频率而异?如果是,那么如何std::chrono处理?如果不是,一个周期对应什么(比如什么是“基本”时间)?有没有办法在编译时访问转换?有没有办法在运行时访问转换?

c++ cpu time benchmarking c++-chrono

5
推荐指数
1
解决办法
1432
查看次数

AVX2代码慢,没有AVX2

我一直在努力开始使用AVX2指令而运气不好(这个功能列表很有帮助).最后,我得到了我的第一个程序编译和做我想要的.我必须做的程序需要两个,u_char并且复合了两个.本质上,我使用它来解码存储在相机的u_char数组中的数据,但我认为这与此问题无关.

获得double两者的过程u_char是:

double result = sqrt(double((msb<<8) + lsb)/64);
Run Code Online (Sandbox Code Playgroud)

where msblsbu_char具有最高有效位(msb)的两个变量和要计算的较低有效位(lsb)double.数据被存储在表示行主矩阵,其中的阵列msblsb值编码列的i分别是在第二和第三行.我用和不用AVX2编码了这个:

void getData(u_char* data, size_t cols, std::vector<double>& info)
{
  info.resize(cols);
  for (size_t i = 0; i < cols; i++)
  {
    info[i] = sqrt(double((data[cols + i] << 8) + data[2 * cols + i]) / 64.0);
    ;
  }
}

void getDataAVX2(u_char* data, size_t cols, std::vector<double>& info)
{ …
Run Code Online (Sandbox Code Playgroud)

c++ performance x86 avx2

4
推荐指数
1
解决办法
662
查看次数