我正在分析在多個處理器上運行的並行算法。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