首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在GCC x86中使用RDTSC计算时钟周期?

如何在GCC x86中使用RDTSC计算时钟周期?
EN

Stack Overflow用户
提问于 2018-08-20 00:32:51
回答 2查看 0关注 0票数 0

使用Visual Studio,我可以从处理器读取时钟周期数,如下所示。我如何与GCC做同样的事情?

代码语言:javascript
复制
#ifdef _MSC_VER             // Compiler: Microsoft Visual Studio

    #ifdef _M_IX86                      // Processor: x86

        inline uint64_t clockCycleCount()
        {
            uint64_t c;
            __asm {
                cpuid       // serialize processor
                rdtsc       // read time stamp counter
                mov dword ptr [c + 0], eax
                mov dword ptr [c + 4], edx
            }
            return c;
        }

    #elif defined(_M_X64)               // Processor: x64

        extern "C" unsigned __int64 __rdtsc();
        #pragma intrinsic(__rdtsc)
        inline uint64_t clockCycleCount()
        {
            return __rdtsc();
        }

    #endif

#endif
EN

回答 2

Stack Overflow用户

发布于 2018-08-20 09:20:26

在最新版本的Linux上,gettimeofday将采用纳秒时序。

如果你真的想要调用RDTSC,可以使用以下内联汇编:

代码语言:javascript
复制
#if defined(__i386__)

static __inline__ unsigned long long rdtsc(void)
{
    unsigned long long int x;
    __asm__ volatile (".byte 0x0f, 0x31" : "=A" (x));
    return x;
}

#elif defined(__x86_64__)

static __inline__ unsigned long long rdtsc(void)
{
    unsigned hi, lo;
    __asm__ __volatile__ ("rdtsc" : "=a"(lo), "=d"(hi));
    return ( (unsigned long long)lo)|( ((unsigned long long)hi)<<32 );
}

#endif
票数 0
EN

Stack Overflow用户

发布于 2018-08-20 09:53:02

你可以通过使用GCC的__rdtsc内在函数来避免内联汇编x86intrin.h

它的定义是gcc/config/i386/ia32intrin.h

代码语言:javascript
复制
/* rdtsc */
extern __inline unsigned long long
__attribute__((__gnu_inline__, __always_inline__, __artificial__))
__rdtsc (void)
{
  return __builtin_ia32_rdtsc ();
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100001395

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档