相关疑难解决方法(0)

获取CPU周期数?

我在SO上看到这篇文章,其中包含C代码以获取最新的CPU周期数:

基于CPU周期计算的C/C++ Linux x86_64中的分析

有没有办法在C++中使用这个代码(欢迎使用windows和linux解决方案)?虽然用C语言编写(而C是C++的一个子集)但我不太确定这段代码是否适用于C++项目,如果没有,如何翻译呢?

我使用的是x86-64

EDIT2:

找到此功能但无法让VS2010识别汇编程序.我需要包含任何内容吗?(我相信我必须换uint64_tlong long窗户......?)

static inline uint64_t get_cycles()
{
  uint64_t t;
  __asm volatile ("rdtsc" : "=A"(t));
  return t;
}
Run Code Online (Sandbox Code Playgroud)

EDIT3:

从上面的代码我得到错误:

"错误C2400:'操作码'中的内联汇编语法错误;找到'数据类型'"

有人可以帮忙吗?

c c++ performance x86 rdtsc

26
推荐指数
5
解决办法
4万
查看次数

Windows 中优于 100 纳秒分辨率的计时器

我从事编程语言分析器工作,正在寻找分辨率优于 100 ns 的 Windows 计时器解决方案。

  • QueryPerformanceCounter应该是一个答案,但在 Windows 10 上返回的频率为QueryPerformanceFrequency10 MHz,在 Windows 7 上甚至更低

  • GetSystemTimePreciseAsFileTime有 100 ns 刻度/步

  • RDTSC分辨率优于1ns,但随频率变化

我的目标分辨率至少为 10 ns。

目前最好的解决方案是什么?

如何QueryPerformanceCounter实施?是否可以轻松拆卸并提高分辨率?

是否可以RDTSC在每次频率变化时直接使用并跟踪/中断?

c c++ benchmarking timing rdtsc

5
推荐指数
1
解决办法
1733
查看次数

获取时间戳的最快方法

我正在实现一些数据结构,其中我需要在一段时间后使某些条目无效,因此对于每个条目,我需要维护其插入时间戳。当我得到一个条目时,我需要再次获取时间戳并计算从插入开始的经过时间(如果它太旧,我无法使用它)。

许多线程高度满足此数据结构,因此我必须以最有效的方式获取此时间戳(oninsertfind)。效率在这里非常重要。

如果重要的话,我正在使用 C++ 开发的 linux 机器上工作。检索时间戳的最有效方法是什么?

顺便说一句,在我正在做的一些旧项目中,我记得我看到了一些直接从 CPU 获取时间戳的汇编命令(不记得命令了)。

c++ linux time cpu-registers

3
推荐指数
1
解决办法
3021
查看次数

在x86_64平台上是否需要rdtsc的mfence?

unsigned int lo = 0;
unsigned int hi = 0;
__asm__ __volatile__ (
    "mfence;rdtsc" : "=a"(lo), "=d"(hi) : : "memory"
);
Run Code Online (Sandbox Code Playgroud)

mfence 在上面的代码中,是否有必要?

根据我的测试,找不到cpu重新排序.

测试代码片段包含在下面.

inline uint64_t clock_cycles() {
    unsigned int lo = 0;
    unsigned int hi = 0;
    __asm__ __volatile__ (
        "rdtsc" : "=a"(lo), "=d"(hi)
    );
    return ((uint64_t)hi << 32) | lo;
}

unsigned t1 = clock_cycles();
unsigned t2 = clock_cycles();
assert(t2 > t1);
Run Code Online (Sandbox Code Playgroud)

c++ linux timestamp x86-64

2
推荐指数
1
解决办法
1094
查看次数

标签 统计

c++ ×4

c ×2

linux ×2

rdtsc ×2

benchmarking ×1

cpu-registers ×1

performance ×1

time ×1

timestamp ×1

timing ×1

x86 ×1

x86-64 ×1