【问题标题】:C/C++ - Simulate long running operationC/C++ - 模拟长时间运行的操作
【发布时间】:2012-02-06 08:09:58
【问题描述】:

我正在分析在多个处理器上运行的并行算法。

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

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

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

有没有办法将这两者结合起来或使用其他东西来获得时间固定的长时间操作?

【问题讨论】:

    标签: c++ c unix


    【解决方案1】:

    在进入循环之前拨打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;
    }
    

    【讨论】:

    • 但我想计算一次 (tv_begin.tv_sec * 1000000 + tv_begin.tv_usec) 会很好,并且可能在内部使用一些短的 for 循环来更少地调用 gettimeofday。我的程序实际上在我的 PC 上运行在多个内核上,而不是 CPU。所以我认为经常从许多奴隶那里调用 gettimeofday 可能太硬核了。
    • 你可以用实时时钟寄存器做这样的事情——如果你的 CPU 有一个——它不会给系统带来那么严重的负载。
    【解决方案2】:

    getitimer()/setitimer()。设置计时器,让 SIGALRM 的信号处理程序设置一个开关,让你跳出循环。循环做它做的事情——或者什么都不做——直到计时器结束。

    【讨论】:

    • 谢谢。我可以试试这个选项。
    • +1,这可能是一个更好的选择,因为它不会在每次迭代时发出系统调用,因此上下文切换更少。
    猜你喜欢
    • 2011-11-30
    • 2012-03-25
    • 2011-01-10
    • 2018-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-03
    • 1970-01-01
    相关资源
    最近更新 更多