通過2個線程程序在1個或2個內核上運行,確保實時性能得以實現的最佳方法是什麼? boost :: timer或RDTSC?表現測量:時間vs滴答?
我們從代碼
boost::timer t;
p.f(frame);
max_time_per_frame = std!::max(max_time_per_frame, t.ellapsed());
... where p is an instance of Proc.
class Proc {
public:
Proc() : _frame_counter(0) {}
// that function must be call for each video frame and take less than 1/fps seconds
// 24 fps => 1/24 => < 0.04 seconds.
void f(unsigned char * const frame)
{
processFrame(frame); //that's the most important part
//that part run every 240 frame and should not affect
// the processFrame flow !
if(_frame_counter % 240 == 0)
{
do_something_more();
}
_frame_counter++;
}
private:
_frame_counter;
}
開始,所以它在單線程/單核的方式運行,我們觀察到max_time_per_frame比因爲do_something_more
處理的目標時較高。 爲了消除這些處理時間尖峯,我們在單獨的線程中開始每個do_something_more
,就像下面的僞代碼一樣。
class Proc {
public:
Proc() : _frame_counter(0) {
t = start_thread (do_something_more_thread);
}
// that function must be call for each video frame and take less than 1/fps seconds
// 24 fps => 1/24 => < 0.04 seconds.
void f(unsigned char * const frame)
{
processFrame(frame); //that's the most important part
//that part run every 240 frame and should not affect
// the processFrame flow !
if(_frame_counter % 240 == 0)
{
sem.up();
}
_frame_counter++;
}
void do_something_more_thread()
{
while(1)
{
sem.down();
do_something_more();
}
}
private:
_frame_counter;
semaphore sem;
thread t;
}
我總是在1和2核上啓動我的程序。所以我使用start /AFFINITY 1 pro.exe
或start /AFFINITY 3 prog.exe
從時間上看,每件事情都沒有問題,max_time_per_frame
保持低於我們的目標,接近0.02秒/幀的平均水平。
但是,如果我轉儲在f中花費的tick的數量,使用RDTSC。
#include <intrin.h>
...
unsigned long long getTick()
{
return __rdtsc();
}
void f(unsigned char * const frame)
{
s = getTick();
processFrame(frame); //that's the most important part
//that part run every 240 frame and should not affect
// the processFrame flow !
if(_frame_counter % 240 == 0)
{
sem.up();
}
_frame_counter++;
e = getTick();
dump(e - s);
}
start /AFFINITY 3 prog.exe
的max_tick_per_frame穩定,預期我看到了1個線程(1個核心的100%)和2號線開始以正常速度二號核心。
start /AFFINITY 1 pro.exe
,我看到只有100%的核心(如預期),但do_something_more
計算時間似乎並沒有在時間交錯的線程執行時間花費。事實上,我定期看到蜱蟲數量猛增。
所以問題是爲什麼?唯一有趣的措施是time
?在1核心(頻率提升)上運行軟件時,tick
是否有意義?
我剛剛在這裏回答了一個類似的問題:http://stackoverflow.com/questions/18089219/obtaining-time-from-clock-cycles – zaufi
我發表此評論以迴應提及.exe文件擴展名。如果您不使用Windows,我的道歉適用。簡而言之,您不能 - MS Windows不是實時操作系統(RTOS) - 您可以近距離使用Windows,但不會實時使用Windows。 – enhzflep
@zaufi,看起來很相似,但我的結果相反,在1或2核上運行soft並不會真正改變'time',但是當在1核上運行/調度2線程時,'tick'的數量會增加對於1幀而不是幾個,就像在下一幀的實時處理期間附加線程執行時間未被擴展/交織一樣。 – alexbuisson