INTEL线程工具原理 -- 重构(Instrumentation)

intel_www 2008-03-31 11:23:12
什么是重构?

英特尔线程检查器在对程序进行跟踪查错之前会对其进行重构。重构操作会在被跟踪的程序内部加入良性的线程检查器库函数调用。这些库函数调用会在软件运行时纪录和线程相关的一些信息,比如内存访问和API调用。这些信息会被用来对线程进行错误诊断。

重构操作有两种不同的类型:源代码重构和二进制重构。

源代码重构指在使用英特尔C++或FORTRAN编译器对源代码进行编译时通过使用“-Qtcheck”选项让编译器在源代码一级加入库函数调用。

二进制重构指在运行时向已经编译好的二进制模块,包括应用程序和动态连接库中加入库函数调用。当你在VTune或者微软.NET开发环境中运行一个英特尔线程检查器活动时重构代码会被自动插入。微软Windows和Linux都支持对IA-32处理器代码进行重构,但是不支持安腾处理器。二进制重构要求软件代码是由被支持的编译器生成的。关于英特尔线程检查器支持哪些编译器请参见其列出的系统要求。

向程序中加入源代码重构或二进制重构的过程会消耗时间(CPU MIPs)和内存。一旦重构代码被加入,你的程序将会比平常运行的更慢且占用更多的内存。这是因为在你的程序运行的同时,英特尔线程检查器库函数也在纪录每一个线程进行的内存访问和线程API调用。
...全文
631 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
lee_beckham 2008-04-13
  • 打赏
  • 举报
回复
强人!
intel_www 2008-04-07
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 ztz0223 的回复:]
有一个问题就是既然重构会消耗更加多的时间和内存
那为什么还要用他呢?
仅仅是为了跟踪软件或者说程序的运行信息?
等待牛人解释!
[/Quote]

重构的目的是为了获取调试工具进行错误定位和性能分析所必需的信息,就好比你在进行程序调试时一般都使用插入调试符号信息Debug版本一样。当利用多线程工具完成程序排错和性能调优之后就不需要再对代码进行重构了。
就呆在云上 2008-04-07
  • 打赏
  • 举报
回复
有一个问题就是既然重构会消耗更加多的时间和内存
那为什么还要用他呢?
仅仅是为了跟踪软件或者说程序的运行信息?
等待牛人解释!
ttlyfast 2008-04-02
  • 打赏
  • 举报
回复
0 :(
ttlyfast 2008-04-02
  • 打赏
  • 举报
回复
intel_www 2008-03-31
  • 打赏
  • 举报
回复
重构级别名称发生了变化。如何将它们与旧的名称对应起来?

这张表按照版本号列出了英特尔线程检查器使用的重构级别名称:

--------------------------------------------
| Version 2.x | Version 1.0 |
--------------------------------------------
| Full Image | All |
--------------------------------------------
| Custom Image | All (selective) |
--------------------------------------------
| All Functions | Partial |
--------------------------------------------
| Custom Functions | Partial (selective) |
--------------------------------------------
| API Imports | Not Applicable |
--------------------------------------------
| Module Imports | Minimal |
--------------------------------------------

intel_www 2008-03-31
  • 打赏
  • 举报
回复
怎样设置缺省的重构级别?


在VTune环境中,你可以通过Configure " Options... " Intel® Thread Checker " Collector " Instrumentation Levels对话框设置缺省的重构级别。

在微软.NET开发环境中,你可以通过Tools " Options... " VTune™ Performance Tools " Intel® Thread Checker " Collector " Instrumentation Levels对话框设置缺省的重构级别。

注意:在一个环境中设置了缺省重构级别,比如在VTune环境中,并不会将改变传播到其它环境中,比如微软.NET开发环境。
intel_www 2008-03-31
  • 打赏
  • 举报
回复
使用二进制重构时,我应该使用哪一个级别?

对于用户代码(应用程序或动态共享库)一般推荐使用缺省的重构级别“All Functions”。如果你担心英特尔线程检查器可能会漏掉某些诊断信息(如静态链接库)并且能够让其使用更多的内存,那么你可以考虑使用“Full Image”级别。对于用户代码不应当将重构级别降到比“All Functions”更低,因为那样做会使英特尔线程检查器产生不准确和不完整的诊断信息。
intel_www 2008-03-31
  • 打赏
  • 举报
回复
使用OpenMP线程,我应该使用源代码重构还是二进制重构?


在微软Windows系统上,两者都可以使用。但是,如果你的程序使用了依赖于线程数目的OpenMP,那么二进制重构必须使用8.0或更高版本的英特尔编译器。

注意:如果对使用任何7.0版英特尔编译器编译的OpenMP程序进行二进制重构,那么英特尔线程检查器会生成错误的结果。

intel_www 2008-03-31
  • 打赏
  • 举报
回复
使用微软Windows线程,我应该使用源代码重构还是二进制重构?

源代码重构或二进制重构都可以使用。如果你正在使用微软Visual C++编译器,那么使用二进制重构是最简便的方法。如果你使用的是英特尔编译器且重新编译源代码很方便,那么你可以考虑使用“/Qtcheck”选项重新生成一个用于英特尔线程检查器的版本。这样做可以通过英特尔线程检查器得到最详细的诊断信息。
intel_www 2008-03-31
  • 打赏
  • 举报
回复
源代码重构和二进制重构哪一种更好?

一般而言,使用源代码重构你将从英特尔线程检查器获得更加详细的诊断信息;但是,通过其中任何一种你都可以得到类似的诊断结果,
intel_www 2008-03-31
  • 打赏
  • 举报
回复
能够同时使用源代码和二进制重构吗?


可以。一个模块(应用程序和动态共享库)的部分源文件可以以源代码重构方式编译(/Qtcheck),同时其它剩余源文件使用二进制重构。同一个进程中的不同的模块也可以部分采用源代码重构而其余部分采用二进制重构。

567

社区成员

发帖
与我相关
我的任务
社区描述
英特尔® 边缘计算,聚焦于边缘计算、AI、IoT等领域,为开发者提供丰富的开发资源、创新技术、解决方案与行业活动。
社区管理员
  • 英特尔技术社区
  • shere_lin
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧