如何在程序集级别分析c++函数
How to profile a C++ function at assembly level?
我有一个函数,它是程序的瓶颈。它不需要访问内存,只需要计算。它是一个内循环,被多次调用,所以这个函数的任何小收益都是我的程序的大胜利。
我的背景是在PS3上优化SPU代码,您使用SPU程序并通过管道分析器运行它,您可以将每个汇编语句放在自己的列中,并最大限度地减少函数所需的循环次数。然后你叠加循环,这样你就可以最小化管道依赖。有了这个程序和每条汇编指令的循环列表,我可以比编译器更好地优化它。
在不同的平台上,它有我可以注册的事件(缓存丢失,周期等),我可以运行该函数并跟踪CPU事件。那也很不错。
现在我正在做一个业余项目在Windows上使用Visual Studio c++ 2010 w/a Core i7英特尔处理器。我没有足够的钱来支付VTune的大笔费用。
我的问题:
如何对Windows上的英特尔处理器的汇编级功能进行配置?
我想编译,查看反汇编,获取性能指标,调整代码并重复。
有一些很棒的免费工具可用,主要是AMD的CodeAnalyst(从我在i7和我的phenom II上的经验来看,它在英特尔处理器上有点缺陷,因为它不能访问直接的硬件特定计数器,尽管这可能是糟糕的配置)。
然而,一个鲜为人知的工具是英特尔架构代码分析器(它像CodeAnalyst一样免费),它类似于您描述的spu工具,因为它详细描述了延迟,吞吐量和端口压力(基本上是请求调度到ALU, MMU等)逐行为您的程序汇编。Stan Melax在今年的GDC上做了一个关于它和x86优化的演讲,题目是"热点,失败和失败:到金属cpu优化"。
英特尔也有一些与IACA相同的工具,可以在他们的实验/假设代码网站的性能调优部分获得,例如PTU,它是(或曾经是)VTune的实验进化,从我看来,它是免费的。
在深入研究这个问题之前,最好先阅读一下英特尔优化手册。
编辑:正如Ben指出的那样,对于较旧的处理器,时间可能不正确,但这可以通过Agner Fog的优化手册轻松弥补,该手册还包含许多其他精华。
您可能想尝试valgrind中包含的一些实用程序,如callgrind或cachegrind。
Callgrind可以做分析和转储程序集。
和kcachegrind是一个很好的GUI,将显示转储,包括汇编和每条指令的点击数等。
从你的描述听起来你的问题可能是令人尴尬的平行,你考虑过使用ppl的parallel_for
吗?
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 递归函数计算序列中的平方和(并输出过程)
- 对RValue对象调用的LValue ref限定成员函数
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么使用 "this" 指针调用派生成员函数?
- 将对象数组的引用传递给函数
- 函数调用中参数的顺序重要吗
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用不带参数的函数访问结构元素
- 代码在main()中运行,但在函数中出现错误
- 内置函数可查看CPP中的成员变量
- 如何获取std::result_of函数的返回类型
- 如何在c++中为模板函数实例创建快捷方式
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗