Caffe 的 Github 页面包含一个 Windows 分支。我选择了这个分支并创建了一个 Windows DLL。它是基于 https://github.com/BVLC/caffe/blob/master/examples/cpp_classification/classification.cpp 的。 .
DLL 工作并输出正确的分类结果。但是比pyCaffe接口(interface)慢1.5-5倍。非常有趣的是,pyCaffe 接口(interface)在所有测试的计算机上使用 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 编译为 32 位程序,没有 GPU 支持
到目前为止我们已经检查过的可能的事情。
- 编译器优化
- 数据
- 操作系统和计算机配置(如 CPU/内存等)
- 我们在一次执行中进行了多次测量,因此基准测试更加稳定。
- 我们还使用 CodeXL 分析了代码,但我没有发现任何异常,但那当然有点模糊。
最佳答案
我们得出以下结论:Caffe 使用 GLog。 GLog 有致命警告,可能看起来像这样
CHECK(a<=b) << "a must be bigger than b";
这些警告让程序崩溃并且难以捕捉。为此,我们创建了一个类来替换 GLog。它相当简单并使用 std::stringstream。谷歌做了一些聪明的事情。只要条件为真,就不会评估右侧。
他们使用 (void) 0 解决了这个问题。我们错过了那部分。当我想在这里发布分析数据时,我意识到 << 运算符会浪费一些时间。我们开始更仔细地查看分析数据并增加函数调用的次数,这样每个数字都会变得更大更清晰。这让我们找到了解决方案。
关于python - CPP 调用比 Python 接口(interface)调用慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37984768/