欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Windows10下源码编译MXNet C++ api with MKL

程序员文章站 2022-04-05 09:47:11
...

在上一篇《Windows10下源码编译MXNet C++ api with OpenBlas》文章说到可以用Openblas编译生成libmxnet,说实话,以我个人感觉,难度要稍大一些。Openblas在windows下的兼容性实在堪忧,如果自己编译的话,小问题非常多,我不一定写的那么全面,虽然成功编译过,但用起来不是那么上手,从openblas自己编译入手来编译libmxnet,网上相关介绍比较少。

这里我们尝试MKL,个人感觉,只能说这个容易一些,在windows桌面电脑里,我推荐用MKL编译。Intel就这样,保持了其一贯对windows强有力支持和兼容性。

参考

https://github.com/apache/incubator-mxnet/issues/15632

这个配置可供大家参考,但我看了一下,这个版本比较老,而且用法和我的有不少区别。大家可以结合着参考。里面的内容我不重复。下面要写的,全是我自己关于编译时的配置。

上次那个Openblas版本的mxnet的路径是D:\devMXNet\apache-mxnet-151,这次这个mkl版本的我在后面加了一个a,以示路径区别,如下,

D:\devMXNet\apache-mxnet-151a

关于如何安装vs2019,opencv这些老生常谈就不放到这里了。大家可以参考我前面的文章。

修改源码

和上一篇文章中讲到的一样,首先你要修改源码(1.5.1及以下版本),主要是这里
apache-mxnet-151a\include\mxnet\tuple.h
其中关于_MSV_VER的那句,改成下面这个样子(否则后面不能正确生成op.h)

namespace dmlc {
/*! \brief description for optional TShape */
DMLC_DECLARE_TYPE_NAME(optional<mxnet::TShape>, "Shape or None");
DMLC_DECLARE_TYPE_NAME(optional<mxnet::Tuple<int>>, "Shape or None");
// avoid low version of MSVC
#if !(defined(_MSC_VER) && _MSC_VER < 1900)  //#if !defined(_MSC_VER)
template<typename T>
struct type_name_helper<mxnet::Tuple<T> > {
  static inline std::string value() {
    return "tuple of <" + type_name<T>() + ">";
  }
};
#endif
}  // namespace dmlc

Cmake-gui配置

Windows10下源码编译MXNet C++ api with MKL

 

配置结果

Windows10下源码编译MXNet C++ api with MKL

 

有几个警告,忽略不要管。

当然,如果你一定要了解,可以到https://github.com/apache/incubator-mxnet/issues里面去搜索相关的话题,大多数问题里面都有人碰到过。

这样,generating done之后, 你就可以在vs2019中启动生成全部项目了。这个耗时非常长,具体没细看,大约用了2个小时左右吧。这个过程中,生成基本libmxnet.dll一般都没问题。

同样,最后因为缺少op.h,那些samples是无法成功编译的。这时个,就要先生成op.h了。

生成op.h

把所有的*.dll 文件从mkl的安装目录

C:\IntelSWTools\compilers_and_libraries_2020.1.216\windows\redist\intel64_win\mkl

拷贝到

D:\devMXNet\apache-mxnet-151a\cpp-package\scripts>

注意我的OpenCV_world430.dll在一个无关的文件夹下,大概因为这个地方设置到了环境变量Path中的原因,depedencies优先在这里找到了。

总之,你要让OpWrapperGenerator.py能找到所有相关的dll文件即可,在哪里无所谓,能找到就行。

Windows10下源码编译MXNet C++ api with MKL

 

然后生成op.h文件(mx36gpu是我的anaconda mxnet-gpu开发环境)

(mx36gpu) D:\devMXNet\apache-mxnet-151a>cd /d D:\devMXNet\apache-mxnet-151a\cpp-package\scripts
(mx36gpu) D:\devMXNet\apache-mxnet-151a\cpp-package\scripts>python OpWrapperGenerator.py libmxnet.dll
(mx36gpu) D:\devMXNet\apache-mxnet-151a\cpp-package\scripts>

如上提到的本人所示的目录结构,生成的文件最后在这里,

D:\devMXNet\apache-mxnet-151a\cpp-package\include\mxnet-cpp\op.h

生成samples项目

然后回到vs2019,直接点击"生成",切切注意不要点击“重新生成”,否则你又要从头开始,至少一个小时又没了。

Windows10下源码编译MXNet C++ api with MKL

此时你可能还会碰到一些报错,如无法链接到“mxnet_static.lib"什么的。这时候就是一个BUG,类似下面这个样子,

(参考: https://github.com/apache/incubator-mxnet/issues/11628)

13>LINK : fatal error LNK1104: cannot open file 'mxnet_static.lib'
15>LINK : fatal error LNK1104: cannot open file 'mxnet_static.lib'
14>LINK : fatal error LNK1104: cannot open file 'mxnet_static.lib'
16>LINK : fatal error LNK1104: cannot open file 'mxnet_static.lib'
18>LINK : fatal error LNK1104: cannot open file 'mxnet_static.lib'
19>LINK : fatal error LNK1104: cannot open file 'mxnet_static.lib'
17>LINK : fatal error LNK1104: cannot open file 'mxnet_static.lib'
20>LINK : fatal error LNK1104: cannot open file 'mxnet_static.lib'
12>LINK : fatal error LNK1104: cannot open file 'mxnet_static.lib'

解决办法:

直接把文件

D:\devMXNet\apache-mxnet-151a\dev\Release\libmxnet.lib

拷贝到

D:\devMXNet\apache-mxnet-151a\devcpp\cpp-package\example\mxnet_static.lib

注意文件名已经改成了mxnet_static.lib

当然,不嫌麻烦你可以到cmake的配置文件里去改。

成功生成

最后,我截一个12个samples全部成功生成的图给大家,也祝大家顺利编译成功!

Windows10下源码编译MXNet C++ api with MKL

 

相关标签: mxnet