marian/vs/NOTES.md
Roman Grundkiewicz 6b568f4afa Merged PR 19904: Update instructions for building on Windows
Changes proposed in this pull request:
1. Clarified instructions how to build Marian on Windows in `vs/README.md`.
2. `vs/CheckOrInstallDeps.bat` does not stop if CUDA or MKL are not installed.
2021-07-22 16:44:35 +00:00

5.4 KiB

How to build Marian on Windows with GPU support

This is interesting mostly for developers. Warning: it has been extracted from an old vs/README.md and some information might be outdated.


Known issues

  1. Patch for CUDA 9.2 error: Unsupported Visual Studio Version Error

    When using CUDA 9.2, the latest versions of Visual Studio 2017 are not officially supported by CUDA. Two fixes are proposed:

    • Downgrade Visual Studio to a supported version

    • Edit the file <CUDA install path>\include\crt\host_config.h and change the line 131:

        131     #if _MSC_VER < 1600 || _MSC_VER > 1914
      

      into:

        131     #if _MSC_VER < 1600 || _MSC_VER > 1915
      

    For more information, read this nVidia forum

  2. It does not compile with Boost 1.73 or newer

    It may happen that SimpleWebSocketServer, a 3rd party library that Marian uses for marian-server, does not support the version of Boost available in vcpkg. In such case install a supported version of Boost; if you use vcpkg, an option is to checkout to #5970385, which has Boost 1.72.

    Note that Boost is required only if you compile with marian-server, for compilation using CMake, it is if you set COMPILE_SERVER to TRUE in CMakeSettings.json.


Changes from the master branch

This part gives more information on all changes done in this PR. Refer to this page for commits.

  1. Fix Cuda error : Unsupported Visual Studio Version Error See above for justification and fixes

  2. Fix VS compiler flags / Build in Release, with improved debug info Added VS specific compile and link flags

  3. Fix Warning: D9002: ignoring unknown option '-m64' This one is related to a compiler flag added while finding the package MKL that does not exists for MS compiler.

  4. Fix marian::Backend, marian::cpu::Backend and marian::gpu::Backend conflicts There were name conflicts between the 3 Backend classes that confused the compiler:

    template instantiation resulted in unexpected function type of "void(Ptr<marian::gpu::Backend> backend, [...])" (the meaning of a name may have changed since the template declaration -- the type of the template is "void(Ptr<marian::Backend> backend, [...]").

    To solve this, I changed the declaration of 3 methods to specify the full name with namespace (marian::Backend, instead of Backend).

  5. Fix error : identifier "CUDA_FLT_MAX" is undefined in device code CUDA_FLT_MAX is not seen by CUDA from the device code and I had to declare it as __constant__.

    From StackOverflow:

    Undecorated constants get compiled into both host and device code with gcc based toolchains, but not with the Microsoft compiler.

  6. Fix fatal error C1019: unexpected #else There was preprocessor instructions (#ifdef ... #else ... #endif) in the middle of a call of a macro function (CUDNN_CALL), which is not allowed with MS compiler.

  7. Fix mismatched class/struct forward declarations Microsoft's C++ name mangling makes a distinction between class and struct objects, so definitions and forward declaration must match. See this pdf, page 27, for more information.

    Note: This fix was invalidated by commit # from @frankseide

  8. Fix unresolved external due to a removed #include directive There was an include directive removed from MSVC compilation, but this prevented the build of the project. I'm not sure why this was removed; the comment is:

     #ifndef _WIN32  // TODO: remove this once I updated the Linux-side makefile
    
  9. Fix CUDA+MSVC incompatibility with Boost.Preprocessor The toolchain nvcc+msvc is not correctly handled in Boost.Preprocessor module. See this issue. In the meantime, the recommended workaround is to disable Variadic Macro support in Boost. I created a PR in the Boost repo on GitHub to fix this.

    Note: The library sources have been fixed, but this fix is still needed until the next release of Boost.Preprocessor

  10. Provide implementation for mkstemp / Fix temporary file creation The code explicitely disabled the creation of temporary files because "mkstemp not available in Windows". In fact, mktemp and unlink are both implemented, but they don't work as expected. I used tempnam to replace mkstemp, and added the flag _O_TEMPORARY to the parameters of open to automatically delete the file when it is closed. If unlinkEarly is not set, I added a call to remove in the destructor to delete the file after its closure. I also handled the case of the default value for the base parameter: the path \tmp doesnot exist on Windows, so it is replaced by the value of the %TMP% environment variable in NormalizeTempPrefix.

  11. Revert commit #2f8b093 + Fix copy/paste error while fixing #301 + restrict fix to MSVC compiler. cf Issue #301 -->