我正在分析在多个处理器上运行的并行算法。C/C++ - 模拟长时间运行操作
但它是一个简单的,所以我需要模拟一个长时间运行的操作来分析有效的加速。
sleep()/ usleep()不是一个选项。我需要保持CPU繁忙,以便从机程序在其他从机睡眠期间无法工作。这里加速是不正确的。
长空for-loop是一个选项。但我也想明确设置操作时间。
有没有办法将这两个结合起来,或者使用别的方法来获得时间固定的长操作?
我正在分析在多个处理器上运行的并行算法。C/C++ - 模拟长时间运行操作
但它是一个简单的,所以我需要模拟一个长时间运行的操作来分析有效的加速。
sleep()/ usleep()不是一个选项。我需要保持CPU繁忙,以便从机程序在其他从机睡眠期间无法工作。这里加速是不正确的。
长空for-loop是一个选项。但我也想明确设置操作时间。
有没有办法将这两个结合起来,或者使用别的方法来获得时间固定的长操作?
在进入循环之前调用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;
}
getitimer()/setitimer()。设置计时器,让SIGALRM的信号处理程序设置一个开关,将您打破循环。循环完成它的功能 - 或者什么也不做 - 直到计时器关闭。
谢谢。我可以尝试它作为一个选项。 – BinarySnow 2012-02-06 08:36:08
+1,这可能是一个更好的选择,因为它不会在每次迭代时发出系统调用,因此更少的上下文切换。 – 2012-02-06 08:51:31
谢谢。我会尝试的。 – BinarySnow 2012-02-06 08:25:11
但我想这应该是一个很好的计算(tv_begin.tv_sec * 1000000 + tv_begin.tv_usec)一次,也许使用一些简短的for循环里面更罕见地调用gettimeofday。 我的程序实际上运行在我的电脑上的多个核心,而不是CPU。所以我认为从许多奴隶那里调用gettimeofday往往可能太硬。 – BinarySnow 2012-02-06 08:33:52
你可以用实时时钟寄存器做这样的事情 - 如果你的CPU有一个 - 它不会加载系统那么糟糕。 – 2012-02-06 09:00:18