多核處理器時,__rdtsc()的使用-編程珠璣第一章


根據書中提供的代碼清單1-5,可以完成對於多核處理器的cpu占用率的控制。

但是在使用GetCPUTickCount計時時,下面的算式會出現一點小問題:

這里按照變量millisec 定義的名字,認為后面算式計算的結果是毫米ms,但是

((double)t_end – (double)t_begin)/(double)info.CurrentMhz

實際計算出的結果單位是秒,因為

__rdtsc()得到的cpu周期數,CurrentMhz為cpu頻率,單位為MHZ=周期/秒=周期*1000/毫秒

所以如果在代碼中定義讓cpu工作10ms,休息10ms時,這里實際計算出的時間(單位s)和想要的時間(單位ms)會相差1000,

結果是在任務管理器中看到cpu的占占用率曲線基本沒變化!

代碼清單1-5

_PROCESSOR_POWER_INFORMATION info;

CallNTPowerInformation(11, // query processor power information

NULL, // no input buffer

0, // input buffer size is zero

&info, // output buffer

Sizeof(info)); // outbuf size

__int64 t_begin = GetCPUTickCount();

// do something

__int64 t_end = GetCPUTickCount();

double millisec = ((double)t_end – (double)t_begin)/(double)info.CurrentMhz;

 

多核cpu中控制,cpu使用率曲線:

int main()
{
    HANDLE curhandle = GetCurrentThread();//獲取當前線程句柄
    DWORD_PTR dwThreadAffinityMask = 2;
    if(!SetThreadAffinityMask(curhandle, dwThreadAffinityMask))
    {
        return 0;
    }

    int busytime = 10;//10ms
    int idletime = busytime;
    //DWORD starttime = 0;
    //獲取當前cpu的周期數
    PROCESSOR_POWER_INFORMATION lpOutputBuffer;
    CallNtPowerInformation(
        ProcessorInformation,//獲得處理器信息
        NULL,
        0,
        &lpOutputBuffer,
        sizeof(lpOutputBuffer)
    );
    printf("%d",lpOutputBuffer.CurrentMhz);
    unsigned __int64 starttime;
    unsigned __int64 endtime;
    while(1)
    {
        starttime = __rdtsc();
        //注意:這個地方要再除以一個1000,因為想要求的是ms單位,__rdtsc()得到的cpu周期數,
        //CurrentMhz為cpu頻率,單位為MHZ=周期/秒=周期*1000/毫秒
        while((((double)__rdtsc() - (double)starttime)/1000/(double)lpOutputBuffer.CurrentMhz) <= busytime);
        Sleep(idletime);
    }
    return 0;
}
#endif


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM