我在SO上看到这篇文章,其中包含C代码以获取最新的CPU周期数:
基于CPU周期计算的C/C++ Linux x86_64中的分析
有没有办法在C++中使用这个代码(欢迎使用windows和linux解决方案)?虽然用C语言编写(而C是C++的一个子集)但我不太确定这段代码是否适用于C++项目,如果没有,如何翻译呢?
我使用的是x86-64
EDIT2:
找到此功能但无法让VS2010识别汇编程序.我需要包含任何内容吗?(我相信我必须换uint64_t到long 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:'操作码'中的内联汇编语法错误;找到'数据类型'"
有人可以帮忙吗?
我正在使用unordered_maps的unordered_map,这样我就可以使用"多键"语法引用一个元素:
my_map[k1][k2].
有没有一种方便的方法来使用相同的"多键"语法来检查元素是否存在,然后再尝试访问它?如果没有,最简单的方法是什么?
我已经完成了ARM汇编编程,我想学习英特尔汇编程序.我一直听到所提到的所有这些不同的F/M/N/ASM-但我不确定它们与我希望实现的目标有什么关系?
有人可以帮我确定一下我需要学习如何在英特尔架构上编程低级别吗?我不太明白"不同的汇编程序"如何关联,x86,IA64,AMD64/x86-64等更是如此?
如果它有任何帮助,我最熟悉Eclipse和Visual Studio 08/10 IDE.
我基本上想弄清楚,整个"移动语义"概念是一些全新的,还是只是让现有的代码更容易实现?我总是对减少调用复制/构造函数的次数感兴趣,但我通常使用引用(可能是const)传递对象,并确保我总是使用初始化列表.考虑到这一点(并考虑了整个丑陋的&&语法),我想知道是否值得采用这些原则或者只是按照我已经做的编码?这里有什么新东西要做,还是我已经做过的"更容易"的语法糖?
最初我认为上下文切换的开销是TLB被刷新.但是我刚刚在维基百科上看到:
http://en.wikipedia.org/wiki/Translation_lookaside_buffer
2008年,英特尔(Nehalem)[18]和AMD(SVM)[19]都引入了标签作为TLB条目的一部分,以及在查找期间检查标签的专用硬件.即使这些没有得到充分利用,但可以设想,将来这些标签将识别每个TLB条目所属的地址空间.因此,上下文切换不会导致刷新TLB - 而只是将当前地址空间的标记更改为新任务的地址空间的标记.
以上是否确认较新的Intel CPU TLB不会在上下文切换时刷新?
这是否意味着现在在上下文切换中没有真正的开销?
(我试图理解上下文切换的性能损失)
linux virtualization performance operating-system context-switch
编辑:我的混乱是因为肯定通过预测采取了哪个分支,你是否也在有效地进行目标预测?
这个问题与我关于这个主题的第一个问题有着内在的联系:
看看接受的答案:
无条件分支,固定目标
- 无限循环
goto声明break或continue声明if/else声明的'then'子句结束(跳过该else子句)- 非虚函数调用
无条件分支,变量目标
- 从函数返回
- 虚函数调用
- 函数指针调用
switch语句(如果编译成跳转表)条件分支,固定目标
if声明switch声明(如果汇编成一系列if/else声明)- 循环条件测试
- 在
&&与||运营商- 三元
?:运算符条件分支,变量目标
- 在正常情况下不太可能出现,但编译器可能会综合一个作为优化,结合上述两种情况.例如,在x86上,编译器可以将代码优化
if (condition) { obj->VirtualFunctionCall(); }为条件间接跳转,就像jne *%eax它由于尾调用优化而出现在函数末尾一样.
如果我有以下代码:
if(something){
//a
}
else{
//b
}
Run Code Online (Sandbox Code Playgroud)
(BP ="分支预测"和BTP ="分支目标预测")
其非常明显的BP用于评估条件something.但是,我试图了解BTP是否也参与确定分支中发生的情况a.BTP是否也恰好确定位于branch a/ 的代码的地址b,具体取决于BP的结果?
我问这个维基百科页面(http://en.wikipedia.org/wiki/Branch_target_predictor):
在计算机体系结构中,分支目标预测器是处理器的一部分,其在由处理器的执行单元计算分支指令的目标之前预测所采用的条件分支或无条件分支指令的目标.
它表明BTP用于在预测条件后预测目标.
1)有人可以澄清以上内容吗?
第二个相关问题 - BP和BTP如何与CPU的fetch/decode/execute/write-back管道交互方式不同?BP是从获取还是解码阶段开始的?在条件代码的执行阶段之后,我们可以检查预测是否正确并更新分支预测缓存.
2)BTP如何处理fetch/decode/execute/write-back …
我很难理解当翻译旁视缓冲区的前两个级别导致未命中时会发生什么?
我不确定特殊硬件电路中是否出现"页面行走",或者页表是否存储在L2/L3高速缓存中,或者它们是否只存在于主存储器中.
我有"超出C++标准库"的书,并且没有使用boost的多线程示例.有人会非常友好地向我展示一个简单的例子,其中两个线程使用boost执行 - 让我们说是异步的吗?
我做了一些测试,其中我有两个场景,每个场景有两个相同的功能 - 一个通过引用传递参数,另一个通过值传递.带有字符串的场景显示了大量的性能提升(因为创建了一个字符串的副本,调用了构造函数),而使用long的测试在通过引用传递值时没有显示任何性能提升.事实上,有时表现更差.
这是原始类型的预期吗?没有必要通过引用传递它们吗?
我期待在不使用引用的情况下制作原始类型的副本,因此期望小的性能提升.
为另一个互联网论坛引用道歉,但我认为这很有趣,并想问:
如果你放弃编程语言的"安全"功能并避免像STL和Boost这样的东西,C++会更快.在原始字节到字节中,C++更快,但是C再也是如此.
当你添加STL的行李,Boost你比编写好的C#代码慢.C#JIT和Java jit的优点是这些安全功能得到了很好的优化.C++安全功能依赖于编译器的优化.
因此,如果您对STL和Boost代码不小心,那么您将拥有应用程序的跛脚.
我同意消除安全功能,但我看过很多高频工作广告,他们都要求Boost体验.当然,Boost对于生成快速代码不是一件坏事吗?或者这个人仅仅在理论上说明如果你只是在字节级操作它会更快?
编辑:引用是关于STL和Boost,因此我添加了STL标记.