Although Windows is not the ideal platform for seriously running TVM, it is still handy for quick experiments. However, TVM currently does not build on Windows. I spent some time to make it work and hopefully this will help other people who face the same issue.
Errors when building current TVM
When building on Windows (using command
cmake -G "Visual Studio 15 2017 Win64" for VS 2017 or
cmake -G "Visual Studio 16 2019" for VS 2019), you will very likely to see the following errors:
tvm-master\include\tvm/relay/pass.h(456,14): error C2375: 'tvm::relay::Bind': redefinition; different linkage (compiling source file tvm-master\src\relay\backend\graph_runtime_codegen.cc) tvm-master\include\tvm/relay/expr_functor.h(249): message : see declaration of 'tvm::relay::Bind' (compiling source file tvm-master\src\relay\backend\graph_runtime_codegen.cc)
tvm-master\src\runtime\vm\vm.cc(723,14): error C2065: 'uint': undeclared identifier
tvm-master\3rdparty\compiler-rt\builtin_fp16.h(76): error C2059: syntax error: '.' (compiling source file tvm-master\src\relay\pass\quantize.cc) tvm-master\src\relay\pass\pattern_util.h(210): note: see reference to function template instantiation 'DST_T __truncXfYf2__<float,uint32_t,23,uint16_t,uint16_t,10>(SRC_T)' being compiled with [ DST_T=uint16_t, SRC_T=float ] (compiling source file tvm-master\src\relay\pass\quantize.cc) tvm-master\src\relay\pass\quantize.cc(177): note: see reference to function template instantiation 'tvm::relay::Constant tvm::relay::MakeConstantScalar<int>(tvm::relay::DataType,T)' being compiled with [ T=int ]
For the first two, you can simply add
expr_functor.h and change
However, the last error requires a newer compiler (this error is probably introduced by PR 3260). Therefore, VS2007 will not work - it simply throws syntax error even if you choose to use latest C++ standard.
VS 2009 appears to work - it prompts you to turn on
std:c++latest. By turning on this option (in project property page), TVM does compile without any problem (after fixing the first two issues). However, you will very likely see weird runtime errors in the Python layer when you try to compile some schedules.
I tried to trace down these runtime errors and it appears to me that some exported packed funcs get messed up, e.g. calls to
_Array end up with
_raw_pointer. When compile an earlier version not requiring the latest C++ standard with
std:c++latest, the same happens. I assume something went wrong in the compiler. I would very much like to know what is going on if someone finds it out.
The last option to make things work Windows is to use Clang. Visual Studio 2017 has a toolset
v141_clang_c2. Unfortunately this does not work out of the box, plus this is Clang 3.8.0 (current release is 8.0.0).
VS 2019 comes with its own Clang (probably 7.0). This only works with CMake - first open the root
CMakeLists.txt with VS 2019, then following these instructions to add
x86-Clang-* config. When you do this, CMake configuration page appears and you will see all configurable variables (as in
config.cmake). Repeat here whatever change you made in
config.cmake then hit “build all” in build menu. TVM builds good and Clang allows discrepancy in DLL interface qualifier (a warning is displayed).
You can also install LLVM extension for VS 2019 to use a separate Clang. However, the building process is much slower than using VS 2019’s bundled Clang.
In short, install VS 2019, open
CMakeLists.txt directly, add
x86-Clang-Release config, set CMake options properly, fix the
uint and build (also set output dir if needed).