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

为什么编译器将XMM寄存器用于raw/std数组但不使用向量?

更新:似乎这是MSVC的一个错误,但它也发生在ICC版本14,最高优化(/ o3)打开.

UPDATE2:随着ICC关闭优化,我得到了:

  • std :: array 159,000
  • 原始阵列117,000
  • 矢量162,313

我使用下面的代码比较std :: array vs raw array vs std :: vector的性能.我已经在Win 7 64上使用MSVC 2012编译器和英特尔编译器vs 14进行了测试,并进行了64位编译.CPU是Intel第3代.

结果是(一致地):

  • std :: array~35,600
  • 原始阵列~35,600
  • 矢量~40,000

当我检查组件时,编译器为std::array原始阵列选择XMM寄存器,因此可能正在进行某种SIMD处理?但是,对于std::vector常规的r8-r15寄存器是使用的.

假设我对上述内容是正确的,为什么XMM寄存器不能用于std :: vector?

这是完全工作的测试代码(您需要增加默认的堆栈保留大小):

#include <iostream>
#include <vector>
#include <array>


const unsigned int noElements = 10000000;
const unsigned int noIterations = 500;

void testVector(){
    volatile unsigned long long sum = 0;
    unsigned long long start = 0;
    unsigned long long finish = 0;
    unsigned …
Run Code Online (Sandbox Code Playgroud)

c++ arrays performance stl vector

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

标签 统计

c++ ×2

performance ×2

arrays ×1

c ×1

rdtsc ×1

stl ×1

vector ×1

x86 ×1