2012-02-06 31 views
2

我正在分析在多个处理器上运行的并行算法。C/C++ - 模拟长时间运行操作

但它是一个简单的,所以我需要模拟一个长时间运行的操作来分析有效的加速。

  1. sleep()/ usleep()不是一个选项。我需要保持CPU繁忙,以便从机程序在其他从机睡眠期间无法工作。这里加速是不正确的。

  2. 长空for-loop是一个选项。但我也想明确设置操作时间。

有没有办法将这两个结合起来,或者使用别的方法来获得时间固定的长操作?

回答

4

在进入循环之前调用gettimeofday并记住时间。在循环中,连续呼叫gettimeofday并计算当前时间和开始之间的差异。当差异足够大时,跳出循环。

从本质上说,这样的事情:

struct timeval tv_begin, tv_current; 
gettimeofday(&tv_begin, NULL); 

for (;;) { 
    gettimeofday(&tv_current, NULL); 
    unsigned long long diff = 
     (tv_current.tv_sec * 1000000 + tv_current.tv_usec) - 
     (tv_begin.tv_sec * 1000000 + tv_begin.tv_usec); 

    if (diff > TIMEOUT) 
     break; 
} 
+0

谢谢。我会尝试的。 – BinarySnow 2012-02-06 08:25:11

+0

但我想这应该是一个很好的计算(tv_begin.tv_sec * 1000000 + tv_begin.tv_usec)一次,也许使用一些简短的for循环里面更罕见地调用gettimeofday。 我的程序实际上运行在我的电脑上的多个核心,而不是CPU。所以我认为从许多奴隶那里调用gettimeofday往往可能太硬。 – BinarySnow 2012-02-06 08:33:52

+0

你可以用实时时钟寄存器做这样的事情 - 如果你的CPU有一个 - 它不会加载系统那么糟糕。 – 2012-02-06 09:00:18

2

getitimer()/setitimer()。设置计时器,让SIGALRM的信号处理程序设置一个开关,将您打破循环。循环完成它的功能 - 或者什么也不做 - 直到计时器关闭。

+0

谢谢。我可以尝试它作为一个选项。 – BinarySnow 2012-02-06 08:36:08

+0

+1,这可能是一个更好的选择,因为它不会在每次迭代时发出系统调用,因此更少的上下文切换。 – 2012-02-06 08:51:31