分析一个简单的、一个周期长度的操作
Profiling a simple, one cycle length operation
我们有一个赋值,需要评测"简单指令"(例如加法或逐位)。这意味着多次执行相同的操作(100K+),并以微秒为单位测量平均时间。结果应以循环长度表示:(totalTime/iterations)*cphMHz
。
因此,结果可能会有所不同,但总的来说,我们被告知应该得到接近1个周期长度的结果。只要编程正确,实际结果并不重要。
我的问题是:什么是一个好的配置操作?我需要澄清两点:
- 我使用循环展开来更准确一点,所以在每次迭代中,我执行10个简单的指令。这意味着由于编译器优化,我必须选择一个不会只执行一次的操作(我们不能像学校工作人员那样使用-o标志)。错误的示例:
var = i;
-编译器将只执行最后一个命令 - 什么是真正的"简单指令"?如何知道实际执行的操作数?我试着阅读程序集输出,但我看不懂
希望我足够清楚,任何想法都会很棒。
无论如何,谢谢
p.S不知道这是否重要,但我在CPP 中写道
1)如果启用(或可能启用)优化,这听起来(对我来说)像是一项不可能完成的任务。您永远无法确定编译器在优化过程中会做什么。我肯定会重复使用以前的结果。如果允许/可能的话,我会尝试包含一个要分析的原始汇编程序片段(这样你就可以确保没有额外的开销;尽管它仍然可以优化)。
2) 至于指令:一个汇编程序命令就是一条指令。例如,根据可用的指令集和内容,a += i
很可能会产生4条指令:读取a、读取i、添加、写入a。读取汇编非常简单。根据指令集/处理器的不同,可能有不同的读取"方向"(即"从->到")。x86汇编程序(以及大多数其他常见处理器的汇编程序)更喜欢instruction target, source
,而DSP更喜欢使用instruction source, target
。重要的是要知道:移动数据必须通过寄存器进行。因此,即使是像a = b
这样的单个赋值也会产生两条指令(b
到寄存器,a
到寄存器)。
一般来说,如果这个答案指向错误的方向,请尝试详细说明您的特定任务及其要求(例如,要使用哪种编译器),并给我一个简短的评论。
- 为什么一个向量上的多线程操作很慢
- 给定一个整数数组,需要在Max_Heap上运行操作。得到错误"segmentation fault",有什么想法吗?(C++)
- 为表示一个或多个操作的C++函数的int参数寻找类型安全的替换
- 完成任何一个操作后,该程序会自动退出,为什么?
- 编译一个自定义的tf操作,其中输入是5d张量
- 是否有一个C++函数可以准确返回平方根反比的内置 CPU 操作 RSQRTSS 的值?
- 在 "CodePad" 中执行链表操作时转储的核心(这是一个在线C++编译器)
- 如何仅覆盖一个EXPECT_CALL的默认ON_CALL操作,并在以后返回到默认操作
- 是新的(&*p)双倍;一个无操作。因此,uninitialized_default_construct是否也变得无操作?
- 当我尝试在 tensorflow 中添加一个新操作时如何 #include "include/libxsmm.h"?
- 发送到另一个窗口的鼠标移动消息不执行任何操作
- 递归推动POP POSTFIX计算器无法正确执行操作,只需将最后一个数字作为结果
- 内联一个操作堆上数据的函数
- 需要帮助创建一个休眠条件的循环,当满足条件时,它会停止,直到下一个操作
- 如何使用 string::find 在一个操作中查找"+"或"-"
- 在 Visual Studio 2010 c++ 中的下一个操作中断
- 在队列上的最后一个操作循环中的错误
- 测试一个操作在Qt中花费多少时间的最简单方法
- 为什么此中断不终止程序,而是继续执行下一个操作?
- C++:重新定义子类中的一个或另一个操作