相关疑难解决方法(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万
查看次数

有没有办法从C#调用RDTSC汇编指令?

我想为我的C#应用​​程序提供一个非常高分辨率的计时器.我想访问RDTSC汇编指令.有没有办法做到这一点?

编辑:我正在移植一些C++代码并尝试保留与原始相同的功能.我可能会切换到更多的.NET,但想要评估RDTSC指令,以便我可以将结果与原始结果进行比较.

c#

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

为什么std :: vector的速度是原始数组的两倍?包含完整代码

结果:

矢量时间:7051

阵列时间:18944

我为此使用了MSVC释放模式,编译为32位.

在此测试之前,我正在查看GCC的矢量源代码并且感到惊讶,因为我认为operator[]检查了数组越界,但事实并非如此.但是,我没想到矢量这么快?!

完整代码:

#include <iostream>
#include <vector>

int main(){
    const int size = 10000;
    unsigned long long my_array[size];
    std::vector<unsigned long long> my_vec;

    my_vec.resize(size);

    //Populate containers
    for(int i=0; i<size; i++){
        my_vec[i] = i;
        my_array[i] = i;
    }

    //Initialise test variables
    unsigned long long sum = 0;
    unsigned long long time = 0;
    unsigned long long start = 0;
    unsigned long long finish = 0;

    //Time the vector
    start = __rdtsc();
    for(int i=0; i<size; i++){
        sum += …
Run Code Online (Sandbox Code Playgroud)

c++ arrays optimization performance vector

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

是否有比cpuid更便宜的序列化指令?

我已经看到了相关的问题,包括这里这里,但似乎有关序列化的唯一指令rdtsccpuid.

不幸的是,cpuid我的系统需要大约1000个周期,所以我想知道是否有人知道更便宜(更少的周期和没有读或写内存)序列化指令?

我看着iret,但这似乎改变了控制流程,这也是不可取的.

我实际上看过亚历克斯的答案中关联的白纸rstscp,但它说:

在读取计数器之前,RDTSCP指令等待直到执行了所有先前的指令.然而,后续指令可以在执行读取操作之前开始执行.

第二点似乎是让它不理想.

intel rdtsc cpu-cache

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

标签 统计

c++ ×2

performance ×2

rdtsc ×2

arrays ×1

c ×1

c# ×1

cpu-cache ×1

intel ×1

optimization ×1

vector ×1

x86 ×1