矩阵乘法运行时间 Python < C++ < Matlab - 解释

Posted

技术标签:

【中文标题】矩阵乘法运行时间 Python < C++ < Matlab - 解释【英文标题】:Matrix multiplication running times Python < C++ < Matlab - Explain 【发布时间】:2011-02-19 15:08:43 【问题描述】:

我有一个矩阵M 那就是16384 x 81。我想计算M * M.t(结果将是16384x16384)。

我的问题是:谁能解释一下运行时间差异

在 C++ 中使用 OpenCV 以下代码需要 18 秒

#include <cv.h>
#include <cstdio>
using namespace cv;
int main(void) 
  Mat m(16384, 81, CV_32FC1);
  randu(m, Scalar(0), Scalar(1));
  int64 tic = getTickCount();
  Mat m2 = m * m.t();
  printf("%f", (getTickCount() - tic) / getTickFrequency());

Python 中,以下代码只需要 0.9 秒 18.8 秒(请参阅下面的评论)

import numpy as np
from time import time
m = np.random.rand(16384, 81)
tic = time()
result = np.dot(m, m.T)
print (time() - tic)

MATLAB 中,以下代码需要 17.7 秒

m = rand(16384, 81); 
tic;
result = m * m';
toc;

我唯一的猜测是这是一个内存问题,并且 Python 能够以某种方式避免交换空间。但是,当我观看top 时,我并没有看到我的C++ application 使用了所有内存,我曾预计C++ 会赢得胜利。感谢您提供任何见解。

编辑

修改我的示例以仅对操作计时后,现在使用 Python 的代码也需要 18 秒。我真的不确定发生了什么,但如果有足够的内存,它们现在似乎都执行相同的操作。

如果行数为 8192,以下是时间: C++:4.5 秒 Python:4.2 秒 Matlab:1.8 秒

【问题讨论】:

numpy 中的计算密集型例程是用 C 编写的,因此 numpy 这么快并不奇怪——但不确定为什么它比 OpenCV 快得多。 @Geoff,你为什么要测量rand()的时间?如果要测量 GEMM(乘法时间),则不应测量 rand time。此外,还可以有程序的启动时间。 Python 这么慢! ;) 我在每个示例中添加了围绕操作本身的计时代码。事实证明,仅仅这样做会使 Python 的时间增加到 18 秒。你认为我应该关闭这个吗?我不想让未来的读者感到困惑。 @Jesse Cohen:它不依赖于Cnumpy 只是能够使用适当的库。然而matlab 也是如此,所以它们应该彼此靠近。这里没有Python 魔法。谢谢 【参考方案1】:

你在哪个 CPU 上运行?对于具有动态时钟的现代 x86 和 x64 芯片,getTickCountgetTickFrequency 不可信。

18 秒足以从基于定时器中断的标准操作系统函数中获得可接受的精度。

您在 OpenCV 中使用什么 BLAS? MatLab 安装了一些高度优化的,IIRC 甚至可以检测您的 CPU 并适当地加载 Intel 或 AMD 的数学库。

【讨论】:

以上是关于矩阵乘法运行时间 Python < C++ < Matlab - 解释的主要内容,如果未能解决你的问题,请参考以下文章

矩阵乘法性能 numpy 和 eigen c++

C++ openMP 并行矩阵乘法

c++动态内存分配-矩阵乘法

c++实现矩阵乘法

在 C++ 程序崩溃中使用动态编程进行矩阵链乘法?

使用矢量化 C++ 的矩阵乘法