第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

得到CPU周期計數(shù)了嗎?

得到CPU周期計數(shù)了嗎?

C++ C
holdtom 2019-06-20 15:38:34
得到CPU周期計數(shù)了嗎?我看到了這篇文章,其中包含C代碼以獲取最新的CPU周期計數(shù):C/C+Linux x86_64中基于CPU周期計數(shù)的分析有什么方法可以在C+(Windows和Linux解決方案歡迎)中使用這段代碼嗎?雖然是用C編寫的(C是C+的一個子集),但我不太確定這段代碼是否能在C+項目中工作,如果不是,如何翻譯它?我使用的是x86-64EDIT 2:找到此功能,但無法獲得VS 2010來識別匯編程序。我需要包括什么嗎?(我想我得交換一下uint64_t到long long對于窗戶.?)static inline uint64_t get_cycles(){   uint64_t t;   __asm volatile ("rdtsc" : "=A"(t));   return t;}EDIT 3:從上面的代碼中我得到了錯誤:錯誤C 2400:‘操作碼’中內(nèi)聯(lián)匯編程序語法錯誤;找到‘數(shù)據(jù)類型’“有人能幫忙嗎?
查看完整描述

3 回答

?
慕桂英4014372

TA貢獻1871條經(jīng)驗 獲得超13個贊

從GCC 4.5及更高版本開始,__rdtsc()內(nèi)稟現(xiàn)在得到MSVC和GCC的支持。

但所需的包含是不同的:

#ifdef _WIN32#include <intrin.h>#else#include <x86intrin.h>#endif

這是GCC 4.5之前的最初答案。

直接退出了我的一個項目:

#include <stdint.h>//  Windows#ifdef _WIN32#include <intrin.h>uint64_t rdtsc(){
    return __rdtsc();}//  Linux/GCC#elseuint64_t rdtsc(){
    unsigned int lo,hi;
    __asm__ __volatile__ ("rdtsc" : "=a" (lo), "=d" (hi));
    return ((uint64_t)hi << 32) | lo;}#endif


查看完整回答
反對 回復(fù) 2019-06-20
?
呼喚遠方

TA貢獻1856條經(jīng)驗 獲得超11個贊

VC+對內(nèi)聯(lián)程序集使用完全不同的語法-但只在32位版本中使用.64位編譯器根本不支持內(nèi)聯(lián)程序集。

在這種情況下,這很可能也是-rdtsc當涉及到定時代碼序列時,(至少)有兩個主要問題。首先(與大多數(shù)指令一樣)它可以按順序執(zhí)行,因此,如果您試圖安排一個簡短的代碼序列,rdtsc在該代碼之前和之后都可能執(zhí)行,或者在它之后執(zhí)行,或者您有什么內(nèi)容(我相當肯定這兩個代碼將始終按照彼此的順序執(zhí)行,因此至少兩者之間的區(qū)別永遠不會是否定的)。

其次,在多核(或多處理器)系統(tǒng)上,一個rdtsc可能在一個核心/處理器上執(zhí)行,另一個在另一個核心/處理器上執(zhí)行。在這種情況下,結(jié)果是否定的完全有可能。

一般來說,如果您想要在Windows下有一個精確的定時器,最好使用QueryPerformanceCounter.

如果你真的堅持用rdtsc,我相信您必須在一個完全用匯編語言編寫的單獨模塊中完成(或者使用編譯器內(nèi)部的),然后與您的C或C+鏈接。我從未為64位模式編寫過該代碼,但在32位模式下,它看起來如下所示:

   xor eax, eax
   cpuid
   xor eax, eax
   cpuid
   xor eax, eax
   cpuid
   rdtsc   ; save eax, edx   ; code you're going to time goes here

   xor eax, eax
   cpuid
   rdtsc

我知道這看起來很奇怪,但實際上是對的。執(zhí)行CPUID是因為它是一個序列化指令(不能按順序執(zhí)行),并且可以在用戶模式下使用。在開始計時之前執(zhí)行三次,因為Intel記錄了第一次執(zhí)行可以/將以與第二次執(zhí)行不同的速度運行的事實(他們建議的是三次,所以三次)。

然后執(zhí)行正在測試的代碼、強制序列化的另一個cpuid和最后的rdtsc以獲得代碼完成后的時間。

同時,您希望使用操作系統(tǒng)提供的任何方式來強制在一個進程/核心上運行所有這些。在大多數(shù)情況下,您還希望強制代碼對齊-對齊方式的更改會導(dǎo)致執(zhí)行Spee中相當大的差異。

最后,你想要多次執(zhí)行它-它總是有可能在中間被打斷(例如,任務(wù)切換),所以你需要做好準備,一次執(zhí)行所需的時間要比其他時間長得多-例如,5次運行每次花費40到43次時鐘周期,第六次執(zhí)行需要10000多個時鐘周期。顯然,在后一種情況下,您只需排除異常值-這不是來自您的代碼。

摘要:設(shè)法執(zhí)行rdtsc指令本身(幾乎)是你最不擔心的。更多的是你需要在您從rdtsc那實際上意味著什么。


查看完整回答
反對 回復(fù) 2019-06-20
  • 3 回答
  • 0 關(guān)注
  • 904 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號