【问题标题】:BLAS routines in profiler?分析器中的 BLAS 例程?
【发布时间】:2018-02-28 00:26:48
【问题描述】:

我正在尝试分析一些调用 GEMM 进行矩阵乘法的 Fortran 代码。

我曾经使用双精度并且看到 dgemm 调用正如我所期望的那样,但现在我已经切换到单精度,我在分析器的任何地方都看不到 sgemm

说实话,我不明白dgemm 是怎么出现的。 BLAS 库不需要用-pg 编译来创建必要的符号吗?

这是对 BLAS 库使用英特尔 MKL,对分析器使用 gprof。

【问题讨论】:

  • 你的代码在哪里?你是 matmul() 吗?
  • 我们确实需要一个清晰的问题陈述。哪个profiler,在哪个配置,看不到GEMM,在哪个代码。否则,我们只能在您的问题中猜测太多变量。
  • 我是直接调用sgesvd,直接调用sgemm,所以不是MATMUL。
  • 我正在用-pg-O3 编译我的代码。这会生成一个 gmon.out 文件,然后我使用 gprof [EXECUTABLE_PATH] 生成分析器输出。
  • 你能准备一个小的minimal reproducible example,它只调用sgesvd 或sgemm 并且有这个问题吗?向我们展示有问题的 gprof 输出以及代码。

标签: fortran blas intel-mkl gprof


【解决方案1】:

首先,我不推荐 gprof。它不仅遗漏了很多东西,而且会导致您错误地考虑性能,将注意力集中在例程上,而不是程序为什么会这样做。

我使用随机暂停。 Here 是对与您类似的问题的仔细讨论。 DGEMM 的特点是它的速度尽可能快,因为它被设计为灵活,主要是不快。 因此,例如,如果您的程序将大部分时间用于乘小矩阵,如 3x3,则 DGEMM 例程实际上可能会花费 2/3 的时间检查其参数标志,而实际乘法的时间仅为 1/3。 如果您知道这一点,那么您可以轻松编写自己的 ad-hoc 乘数,并获得巨大的加速。 这就是随机暂停和采样调用堆栈会告诉您的内容。

【讨论】:

  • 我还要评论说,英特尔编译器在识别矩阵乘法时可以生成内联代码和/或调用专门的 MKL 例程。我同意 Mike 的观点,如果您要乘以小矩阵,请不要使用 DGEMM,而要使用 MATMUL。
  • 迈克,我最终转向了英特尔 VTune,它向我展示了 SGEMM 和所有其他 MKL 调用的成本。 (大粉丝,史蒂夫莱昂内尔,大粉丝......)
  • @EMiller:我刚刚看了source code of SGEMM。第 230 行和第 231 行是对 lsame 的调用,每次调用时都会调用它。还有其他调用。我发现,几乎所有时间线 230 或 231 都在堆栈上。这意味着它检查其参数字符标志的时间比其他任何事情都多。消除这一点产生了巨大的加速。
  • 英特尔MKL是否使用相同的源代码?
  • @EMiller:不。MATMUL 例程没有这些选项。由于担心许可证,我们远离了 MKL。
猜你喜欢
  • 2016-11-28
  • 1970-01-01
  • 1970-01-01
  • 2011-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多