2012-02-06 77 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