CPP调用比Python接口调用慢

时间:2016-06-23 07:20:23

标签: python c++ windows dll caffe

Caffe的Github页面包含一个Windows分支。我已经采取了这个分支并创建了一个Windows DLL。它基于https://github.com/BVLC/caffe/blob/master/examples/cpp_classification/classification.cpp而失败。

DLL工作并输出正确的分类结果。但它比pyCaffe接口慢1.5-5倍。非常有趣的是,pyCaffe接口在所有测试的计算机上使用AlexNet对于四个图像大约需要1秒钟。 DLL时间范围从1.5秒到2秒到4秒。

我们测量了

循环前后的时间(使用Easily measure elapsed time
template <typename Dtype> Dtype Net<Dtype>::ForwardFromTo(int start, int end)

此函数驻留在https://github.com/BVLC/caffe/blob/master/src/caffe/net.cpp中,由CPP和Python代码调用。

我们已经使用Visual Studio 2013将Caffe编译为没有GPU支持的32位程序

到目前为止我们检查过的可能事情。

  • 编译器优化
  • 数据
  • 操作系统和计算机配置(如CPU /内存等)
  • 我们在一次执行中多次测量,以使基准更稳定。
  • 我们也使用CodeXL对代码进行了分析,但我找不到任何异常,但这当然有点模糊。

1 个答案:

答案 0 :(得分:1)

我们总结如下:Caffe使用GLog。 GLog有致命警告,可能看起来像这样

CHECK(a<=b) << "a must be bigger than b";

这些警告让程序崩溃,几乎无法捕获。为此,我们创建了一个替换GLog的类。它很简单,使用std :: stringstream。谷歌做得很聪明。只要条件为真,就不会评估右侧。

https://github.com/google/glog/blob/de6149ef8e67b064a433a8b88924fa9f606ad5d5/src/windows/glog/logging.h#L569

他们使用(void)0解决了它。我们错过了那部分。当我想在这里发布分析数据时,我意识到由于&lt;&lt;&lt;&lt;&lt;&lt;运营商。我们开始更仔细地查看分析数据并增加函数调用的数量,这样每个数字都会变得更大更清晰。这导致我们找到解决方案。