0

我有一个矩阵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 秒

4

1 回答 1

3

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

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

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

于 2011-02-19T16:11:02.320 回答