【问题标题】:Intel VTune Profiler shows __mulq is a computationally expensive function in a fortran code英特尔 VTune Profiler 显示 __mulq 是 fortran 代码中计算量大的函数
【发布时间】:2021-10-26 15:19:35
【问题描述】:

我正在尝试对我正在研究的一个相当复杂的多物理场模型进行审计,并且一直在使用英特尔 VTune Profiler 来识别昂贵的子例程。最昂贵的函数是一个名为 __mulq 的函数,它不在源代码中。我可以看到哪些子程序正在调用它,但我无法弄清楚它到底是什么。我正在使用英特尔 fortran 编译器。我还尝试使用 grep 在包含所有代码的目录中搜索 __mulq,而 __mulq 的唯一提及是在二进制文件中。有人可以确定这个 __mulq 函数可能是什么吗?非常感谢您的帮助!

【问题讨论】:

  • @francescalus 我不确定。我怎么能检查?我正在运行 Ubuntu 20.04.2
  • CPU是intel i9,架构是x86_64,有32位和64位两种模式。
  • 如果您使用的是 128 位实数,那么我假设 __mulq 是编译器运行时的一部分,负责处理使用它们的部分算术。 (也许对这个低级位更熟悉的人可以进一步解释。)
  • 我在 Fortran 90 中使用的是 64 位的双精度。您是否建议减少到单精度?
  • 如果有 __mulq,则在 16 字节浮点数上进行浮点乘法,即 Fortran“四倍”精度,这需要额外的支持例程,因为 x86 指令不提供该精度。因此,您的代码不仅仅使用 32 位和 64 位浮点数。

标签: fortran openmp intel-vtune


【解决方案1】:

通过使用 vtune 中的自底向上窗格,您将能够找出调用堆栈,并遍历源代码和程序集,了解哪个库或模块使用了 mulq 函数

从 x86 指南中可以看出 mulq 指令存储两个 64 位值相乘的结果——第一个由源操作数给出,第二个来自寄存器 %rax。由于 mulq 指令在程序集中是低级的,这些指令可能来自库或您在代码中使用的任何模块。如果您能够找出使用 mulq 函数的函数/模块,您可以尝试对模块进行更改以使用差异实现或减少在 mulq 指令中产生的调用。例如,如果这是第三方库,您可以寻找优化的替代方案。

【讨论】:

  • __mulq 函数是 Intel Fortran 的编译器支持例程,用于计算 128 位 float 乘法。它与 mulq cpu 指令相同,将 64 位整数相乘。
猜你喜欢
  • 1970-01-01
  • 2015-02-01
  • 2021-08-25
  • 1970-01-01
  • 2015-12-08
  • 2015-01-18
  • 2012-11-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多