我试图分析一些调用GEMM
进行矩阵乘法的Fortran代码。
我过去常常使用双倍精度,正如我所期望的那样看到dgemm
来电,但是现在我已经切换到单精度,我根本看不到sgemm
在探查器的任何地方。
说实话,我不明白dgemm
是如何出现的。不要用-pg
编译BLAS库来创建必要的符号吗?
这是使用intel MKL作为BLAS库,使用gprof作为探查器。
答案 0 :(得分:0)
首先,我不推荐 gprof 。它不仅错过了很多,而且还导致你对性能的错误思考,关注例程,而不是为什么程序正在做它正在做的事情。
我使用随机暂停。 Here是一个与您类似的问题的仔细讨论。 关于DGEMM的问题在于它的速度和它一样快,因为它被设计为灵活,主要是不快。 因此,例如,如果你的程序花费大部分时间乘以小矩阵,比如3x3,则DGEMM例程实际上可以花费2/3的时间来检查其参数标志,并且只有1/3实际上是乘法。 如果您知道这一点,那么您可以轻松编写自己的ad-hoc乘数,并获得巨大的加速。 这就是调用堆栈随机暂停和采样会告诉你的。