diff options
author | Soumith Chintala <soumith@gmail.com> | 2016-11-13 08:25:43 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-11-13 08:25:43 +0300 |
commit | 2c4a219fe116e9015b44ecef4687f2b0f8debe16 (patch) | |
tree | 80c75443631e908a3773993d84da924a98fcc347 | |
parent | 89d92a5925eac6df9dc9489d40c44451da187e5f (diff) | |
parent | d7012d2302a4f943385716d73975d67f8eccaa41 (diff) |
Merge pull request #175 from BTNC/master
Torch installation in a self-contained folder for windows with msvc
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | README.md | 3 | ||||
-rw-r--r-- | clean.bat | 24 | ||||
-rw-r--r-- | install-deps.bat | 419 | ||||
-rw-r--r-- | install.bat | 69 | ||||
-rw-r--r-- | test.bat | 88 | ||||
-rw-r--r-- | uninstall.bat | 31 | ||||
-rw-r--r-- | win-files/README.md | 92 | ||||
-rw-r--r-- | win-files/patch/cudnn.patch | 21 | ||||
-rw-r--r-- | win-files/patch/cunn.patch | 85 | ||||
-rw-r--r-- | win-files/patch/lua-cjson.patch | 67 | ||||
-rw-r--r-- | win-files/patch/luaffifb.patch | 189 | ||||
-rw-r--r-- | win-files/patch/torch.patch | 26 | ||||
-rw-r--r-- | win-files/test/ffifb_perf_ffi.lua | 37 | ||||
-rw-r--r-- | win-files/test/ffifb_perf_purelua.lua | 33 |
15 files changed, 1184 insertions, 1 deletions
@@ -2,3 +2,4 @@ build/ install/ */*/build extra/luafilesystem/lfs.so +win-files/3rd/ @@ -3,7 +3,8 @@ Self-contained Torch installation ============ -#### Please refer to the [Torch installation guide](http://torch.ch/docs/getting-started.html#_) for details on how to make a fresh install of Torch. +#### Please refer to the [Torch installation guide](http://torch.ch/docs/getting-started.html#_) for details on how to make a fresh install of Torch on Linux or MacOS. +#### If on windows with msvc, please refer to this [guide](win-files/README.md) for details on installation and usage. ## Repo content diff --git a/clean.bat b/clean.bat new file mode 100644 index 0000000..8e67be4 --- /dev/null +++ b/clean.bat @@ -0,0 +1,24 @@ +@setlocal enableextensions +@echo off + +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:::: This script cleans temporary compilation file :::: +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + + +set TORCH_DISTRO=%~dp0. + +for /d %%G in ("%TORCH_DISTRO%\win-files\3rd\wineditline-*") do rmdir /s /q "%%~G"\build +cd %TORCH_DISTRO%\win-files\3rd\dlfcn-win32 && git clean -fdx + +cd %TORCH_DISTRO%\exe\lua-5.1.5 && del /q *.obj *.o *.lib *.dll *.exp *.exe +cd %TORCH_DISTRO%\exe\lua-5.2.4 && del /q *.obj *.o *.lib *.dll *.exp *.exe +cd %TORCH_DISTRO%\exe\lua-5.3.3 && del /q *.obj *.o *.lib *.dll *.exp *.exe +cd %TORCH_DISTRO%\exe\luajit-2.0 && git clean -fdx +cd %TORCH_DISTRO%\exe\luajit-2.1 && git clean -fdx +cd %TORCH_DISTRO%\exe\luarocks && git clean -fdx + +cd %TORCH_DISTRO% && git submodule foreach --recursive git clean -fdx + +echo Cleaning is finished +@endlocal diff --git a/install-deps.bat b/install-deps.bat new file mode 100644 index 0000000..244272a --- /dev/null +++ b/install-deps.bat @@ -0,0 +1,419 @@ +@echo off + +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:::: This script setup directories, dependencies for Torch7 :::: +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + + +:::: Customizable variables :::: + + +:: which lua version will be installed for Torch7, default to LUAJIT21 +:: accepted lua versions: LUAJIT21, LUAJIT20, LUA53, LUA52, LUA51 +REM set TORCH_LUA_VERSION=LUAJIT21 + +:: where to install Torch7, default to install\ under distro\ +REM set TORCH_INSTALL_DIR=D:\Torch + +:: conda environment name for Torch7, default to torch-vcversion +REM set TORCH_CONDA_ENV=mytorch7 + +:: which blas/lapack libraries will be used, default to openblas installed by conda +:: [1] mkl: download from https://software.intel.com/intel-mkl, install and set following two variables +REM set INTEL_MKL_DIR=D:\\Intel\\SWTools\\compilers_and_libraries\\windows\\mkl\\ +REM set INTEL_COMPILER_DIR=D:\\Intel\\SWTools\\compilers_and_libraries\\windows\\compiler\\ +:: [2] other: set path to the blas library and path to the laback library +:: both BLAS and LAPACK should be set even if they refer to the same library +:: take openblas for example: download latest release from https://github.com/xianyi/OpenBLAS/releases/latest +:: use mingw cross compiler tools in cygwin, since mingw windows native gfortrain is available in cygwin but not in msys2 +:: compilation command in cygwin: make CC=x86_64-w64-mingw32-gcc FC=x86_64-w64-mingw32-gfortran CROSS_SUFFIX=x86_64-w64-mingw32- +:: please refer to openblas's README for detailed installation instructions +REM set BLAS_LIBRARIES=D:\\Libraries\\lib\libopenblas.dll.a +REM set LAPACK_LIBRARIES=D:\\Libraries\\lib\libopenblas.dll.a + +:: where to find cudnn library +REM set CUDNN_PATH=D:\NVIDIA\CUDNN\v5.1\bin\cudnn64_5.dll + +:: whether update dependencies if already setup, default to not update +REM set TORCH_UPDATE_DEPS= + +:::: End of customization :::: + + +set ECHO_PREFIX=+++++++ +set TORCH_SETUP_FAIL=1 + +:::: validate msvc version :::: + +if "%VisualStudioVersion%" == "" ( + if not "%VS140COMNTOOLS%" == "" ( call "%VS140COMNTOOLS%..\..\VC\vcvarsall.bat" x64 && goto :VS_SETUP) + if not "%VS120COMNTOOLS%" == "" ( call "%VS120COMNTOOLS%..\..\VC\vcvarsall.bat" x64 && goto :VS_SETUP) + if not "%VS110COMNTOOLS%" == "" ( call "%VS110COMNTOOLS%..\..\VC\vcvarsall.bat" x64 && goto :VS_SETUP) + if not "%VS100COMNTOOLS%" == "" ( call "%VS100COMNTOOLS%..\..\VC\vcvarsall.bat" x64 && goto :VS_SETUP) + if not "%VS90COMNTOOLS%" == "" ( call "%VS90COMNTOOLS%..\..\VC\vcvarsall.bat" x64 && goto :VS_SETUP) +) +:VS_SETUP + +if "%VisualStudioVersion%" == "" ( + echo %ECHO_PREFIX% Can not find environment variable VisualStudioVersion, msvc is not setup porperly + goto :FAIL +) + +set TORCH_VS_VERSION=%VisualStudioVersion:.0=% + +if "%PreferredToolArchitecture%" == "x64" ( + if "%CommandPromptType%" == "Cross" ( + if "%Platform%" == "ARM" set TORCH_VS_PLATFORM=amd64_arm + if "%Platform%" == "X86" set TORCH_VS_PLATFORM=amd64_x86 + ) +) else ( + if "%CommandPromptType%" == "Cross" ( + if "%Platform%" == "ARM" set TORCH_VS_PLATFORM=x86_arm + if "%Platform%" == "x64" set TORCH_VS_PLATFORM=x86_amd64 + ) + if "%CommandPromptType%" == "Native" ( + if "%Platform%" == "X64" set TORCH_VS_PLATFORM=x64 + ) + if "%Platform%" == "" set TORCH_VS_PLATFORM=x86 +) + +if "%TORCH_VS_PLATFORM%" == "x86" set TORCH_VS_TARGET=x86 +if not "%TORCH_VS_PLATFORM%" == "%TORCH_VS_PLATFORM:_x86=%" set TORCH_VS_TARGET=x86 +if not "%TORCH_VS_PLATFORM%" == "%TORCH_VS_PLATFORM:_arm=%" set TORCH_VS_TARGET=arm +if "%TORCH_VS_TARGET%" == "" set TORCH_VS_TARGET=x64 + +:::: validate lua version :::: + +:: [TODO] currently luajit lua luarocks are installed from source. they can be changed to use luajit-rocks when +:: luajit-rocks is ready for windows + +if "%TORCH_LUA_VERSION%" == "" set TORCH_LUA_VERSION=LUAJIT21 +if "%TORCH_LUA_VERSION%" == "LUAJIT21" ( + set TORCH_LUAJIT_BRANCH=v2.1 + set TORCH_LUA_SOURCE=luajit-2.1 + set TORCH_LUAROCKS_LUA=5.1 +) +if "%TORCH_LUA_VERSION%" == "LUAJIT20" ( + set TORCH_LUAJIT_BRANCH=master + set TORCH_LUA_SOURCE=luajit-2.0 + set TORCH_LUAROCKS_LUA=5.1 +) +if "%TORCH_LUA_VERSION%" == "LUA53" ( + set TORCH_LUA_SOURCE=lua-5.3.3 + set TORCH_LUAROCKS_LUA=5.3 +) +if "%TORCH_LUA_VERSION%" == "LUA52" ( + set TORCH_LUA_SOURCE=lua-5.2.4 + set TORCH_LUAROCKS_LUA=5.2 +) +if "%TORCH_LUA_VERSION%" == "LUA51" ( + set TORCH_LUA_SOURCE=lua-5.1.5 + set TORCH_LUAROCKS_LUA=5.1 +) +if "%TORCH_LUA_SOURCE%" == "" ( + echo %ECHO_PREFIX% Bad lua version: %TORCH_LUA_VERSION%, only support LUAJIT21, LUAJIT20, LUA53, LUA52, LUA51 + goto :FAIL +) + +:::: Setup directories :::: + +set TORCH_DISTRO=%~dp0. +if "%TORCH_INSTALL_DIR%" == "" set TORCH_INSTALL_DIR=%TORCH_DISTRO%\install +set TORCH_INSTALL_BIN=%TORCH_INSTALL_DIR%\bin +set TORCH_INSTALL_LIB=%TORCH_INSTALL_DIR%\lib +set TORCH_INSTALL_INC=%TORCH_INSTALL_DIR%\include +set TORCH_INSTALL_ROC=%TORCH_INSTALL_DIR%\luarocks +if not exist %TORCH_INSTALL_BIN% md %TORCH_INSTALL_BIN% +if not exist %TORCH_INSTALL_LIB% md %TORCH_INSTALL_LIB% +if not exist %TORCH_INSTALL_INC% md %TORCH_INSTALL_INC% +if not %TORCH_LUAJIT_BRANCH% == "" if not exist %TORCH_INSTALL_BIN%\lua\jit md %TORCH_INSTALL_BIN%\lua\jit +if not exist %TORCH_DISTRO%\win-files\3rd md %TORCH_DISTRO%\win-files\3rd + +echo %ECHO_PREFIX% Torch7 will be installed under %TORCH_INSTALL_DIR% with %TORCH_LUA_SOURCE%, vs%TORCH_VS_VERSION% %TORCH_VS_PLATFORM% +echo %ECHO_PREFIX% Bin: %TORCH_INSTALL_BIN% +echo %ECHO_PREFIX% Lib: %TORCH_INSTALL_LIB% +echo %ECHO_PREFIX% Inc: %TORCH_INSTALL_INC% + +:::: Setup dependencies :::: + +:: has blas/lapack? +if not "%INTEL_MKL_DIR%" == "" if exist %INTEL_MKL_DIR% ( set "TORCH_SETUP_HAS_MKL=1" && set "TORCH_SETUP_HAS_BLAS=1" && set "TORCH_SETUP_HAS_LAPACK=1" ) +if not "%BLAS_LIBRARIES%" == "" if exist %BLAS_LIBRARIES% set TORCH_SETUP_HAS_BLAS=1 +if not "%LAPACK_LIBRARIES%" == "" if exist %LAPACK_LIBRARIES% set TORCH_SETUP_HAS_LAPACK=1 + +:: has cuda? +for /f "delims=" %%i in ('where nvcc') do ( + set NVCC_CMD=%%i + goto :AFTER_NVCC +) +:AFTER_NVCC +if not "%NVCC_CMD%" == "" set TORCH_SETUP_HAS_CUDA=1 + +:: has conda? +for /f "delims=" %%i in ('where conda') do ( + set CONDA_CMD=%%i + goto :AFTER_CONDA +) +:AFTER_CONDA + +if "%CONDA_CMD%" == "" ( + echo %ECHO_PREFIX% Can not find conda, some dependencies can not be resolved + if not "%TORCH_SETUP_HAS_BLAS%" == "1" ( + echo %ECHO_PREFIX% Can not install torch, please either specify the blas library or install conda + goto :FAIL + ) + goto :NO_CONDA +) + +set TORCH_CONDA_INFO=%TORCH_DISTRO%\win-files\check_conda_info_for_torch.txt +conda info > %TORCH_CONDA_INFO% +if "%TORCH_VS_TARGET%" == "x64" set TORCH_CONDA_PLATFORM=win-64 +if "%TORCH_VS_TARGET%" == "arm" set TORCH_CONDA_PLATFORM=win-64 +if "%TORCH_VS_TARGET%" == "x86" set TORCH_CONDA_PLATFORM=win-32 + +findstr "%TORCH_CONDA_PLATFORM%" "%TORCH_CONDA_INFO%" >nul +if errorlevel 1 ( + echo %ECHO_PREFIX% %TORCH_VS_TARGET% Torch7 requires %TORCH_CONDA_PLATFORM% conda, installation will continue without conda + goto :NO_CONDA +) + +if %TORCH_VS_VERSION% GEQ 14 ( set CONDA_VS_VERSION=14&& goto :CONDA_SETUP ) +if %TORCH_VS_VERSION% GEQ 10 ( set CONDA_VS_VERSION=10&& goto :CONDA_SETUP ) +set CONDA_VS_VERSION=9 + +:CONDA_SETUP + +if "%TORCH_CONDA_ENV%" == "" set TORCH_CONDA_ENV=torch-vc%CONDA_VS_VERSION% + +echo %ECHO_PREFIX% Createing conda environment '%TORCH_CONDA_ENV%' for Torch7 dependencies +conda create -n %TORCH_CONDA_ENV% -c conda-forge vc=%CONDA_VS_VERSION% --yes + +set CONDA_DIR=%CONDA_CMD:\Scripts\conda.exe=% +set TORCH_CONDA_LIBRARY=%CONDA_DIR%\envs\%TORCH_CONDA_ENV%\Library +set TORCH_CONDA_LIBRARY=%TORCH_CONDA_LIBRARY:\=\\% +set PATH=%TORCH_CONDA_LIBRARY%\bin;%PATH%; +set NEW_PATH=%CONDA_DIR%\Scripts;%TORCH_CONDA_LIBRARY%\bin;%NEW_PATH% + +set TORCH_CONDA_PKGS=%TORCH_DISTRO%\win-files\check_conda_packages_for_torch.txt +conda list -n %TORCH_CONDA_ENV% > %TORCH_CONDA_PKGS% + +:: has cmake? +:: cmake should be installed before qt since its on qt5 while qtlua is on qt4 +for /f "delims=" %%i in ('where cmake') do ( + set CMAKE_CMD=%%i + goto :AFTER_CMAKE +) +if "%CMAKE_CMD%" == "" ( + echo %ECHO_PREFIX% Installing cmake by conda + conda install -n %TORCH_CONDA_ENV% -c conda-forge cmake --yes +) +:AFTER_CMAKE + +:: need openblas? +findstr "openblas" "%TORCH_CONDA_PKGS%" >nul +if not errorlevel 1 ( set "TORCH_SETUP_HAS_BLAS=1" && set "TORCH_SETUP_HAS_LAPACK=1" ) + +if not "%TORCH_SETUP_HAS_BLAS%" == "1" goto :CONDA_INSTALL_OPENBLAS +if not "%TORCH_SETUP_HAS_LAPACK%" == "1" goto :CONDA_INSTALL_OPENBLAS +goto :AFTER_OPENBLAS + +:CONDA_INSTALL_OPENBLAS +echo %ECHO_PREFIX% Installing openblas by conda, since there is no blas library specified +if not "%TORCH_VS_TARGET%" == "x86" conda install -n %TORCH_CONDA_ENV% -c ukoethe openblas --yes || goto :Fail +if "%TORCH_VS_TARGET%" == "x86" conda install -n %TORCH_CONDA_ENV% -c omnia openblas --yes || goto :Fail + +:AFTER_OPENBLAS +if not "%TORCH_VS_TARGET%" == "x86" ( + if "%BLAS_LIBRARIES%" == "" set BLAS_LIBRARIES=%TORCH_CONDA_LIBRARY%\\lib\\libopenblas.lib + if "%LAPACK_LIBRARIES%" == "" set LAPACK_LIBRARIES=%TORCH_CONDA_LIBRARY%\\lib\\libopenblas.lib +) +if "%TORCH_VS_TARGET%" == "x86" ( + if "%BLAS_LIBRARIES%" == "" set BLAS_LIBRARIES=%TORCH_CONDA_LIBRARY%\\lib\\libopenblaspy.dll.a + if "%LAPACK_LIBRARIES%" == "" set LAPACK_LIBRARIES=%TORCH_CONDA_LIBRARY%\\lib\\libopenblaspy.dll.a +) + +:: other dependencies +findstr "jpeg" "%TORCH_CONDA_PKGS%" >nul +if errorlevel 1 set TORCH_DEPENDENCIES=%TORCH_DEPENDENCIES% jpeg +findstr "libpng" "%TORCH_CONDA_PKGS%" >nul +if errorlevel 1 set TORCH_DEPENDENCIES=%TORCH_DEPENDENCIES% libpng +findstr "zlib" "%TORCH_CONDA_PKGS%" >nul +if errorlevel 1 set TORCH_DEPENDENCIES=%TORCH_DEPENDENCIES% zlib +findstr "libxml2" "%TORCH_CONDA_PKGS%" >nul +if errorlevel 1 set TORCH_DEPENDENCIES=%TORCH_DEPENDENCIES% libxml2 +findstr "qt" "%TORCH_CONDA_PKGS%" >nul +if errorlevel 1 set TORCH_DEPENDENCIES=%TORCH_DEPENDENCIES% qt=4.8.7 + +if not "%TORCH_DEPENDENCIES%" == "" ( + echo %ECHO_PREFIX% Installing %TORCH_DEPENDENCIES% by conda for Torch7 + conda install -n %TORCH_CONDA_ENV% -c conda-forge %TORCH_DEPENDENCIES% --yes +) + +:NO_CONDA +if exist "%TORCH_CONDA_INFO%" del /q %TORCH_CONDA_INFO% +if exist "%TORCH_CONDA_PKGS%" del /q %TORCH_CONDA_PKGS% + +:::: git clone luarocks :::: + +echo %ECHO_PREFIX% Git clone luarocks for its tools +cd %TORCH_DISTRO%\exe\ +if not exist luarocks\.git git clone https://github.com/keplerproject/luarocks.git luarocks +set PATH=%TORCH_DISTRO%\exe\luarocks\win32\tools\;%PATH%; + +:::: install lua :::: + +echo %ECHO_PREFIX% Installing %TORCH_LUA_SOURCE% +cd %TORCH_DISTRO%\exe\ +if not "%TORCH_LUAJIT_BRANCH%" == "" ( +if not exist %TORCH_LUA_SOURCE%\.git git clone -b %TORCH_LUAJIT_BRANCH% http://luajit.org/git/luajit-2.0.git %TORCH_LUA_SOURCE% || goto :Fail + cd %TORCH_LUA_SOURCE% && ( if "%TORCH_UPDATE_DEPS%" == "1" git pull ) & cd src +) else ( + wget -nc https://www.lua.org/ftp/%TORCH_LUA_SOURCE%.tar.gz --no-check-certificate || goto :Fail + 7z x %TORCH_LUA_SOURCE%.tar.gz -y >NUL && 7z x %TORCH_LUA_SOURCE%.tar -y >NUL && cd %TORCH_LUA_SOURCE%\src +) +if not "%TORCH_LUAJIT_BRANCH%"=="" ( + call msvcbuild.bat || goto :FAIL + copy /y jit\* %TORCH_INSTALL_BIN%\lua\jit\ + copy /y luajit.h %TORCH_INSTALL_INC%\luajit.h + set LUAJIT_CMD=%TORCH_INSTALL_DIR%\luajit.cmd +) else ( + del /q *.obj *.o *.lib *.dll *.exp *.exe + cl /nologo /c /O2 /W3 /D_CRT_SECURE_NO_DEPRECATE /MD /DLUA_BUILD_AS_DLL *.c || goto :FAIL + ren lua.obj lua.o || goto :FAIL + ren luac.obj luac.o || goto :FAIL + link /nologo /DLL /IMPLIB:%TORCH_LUA_VERSION%.lib /OUT:%TORCH_LUA_VERSION%.dll *.obj || goto :FAIL + link /nologo /OUT:lua.exe lua.o %TORCH_LUA_VERSION%.lib || goto :FAIL + lib /nologo /OUT:%TORCH_LUA_VERSION%-static.lib *.obj || goto :FAIL + link /nologo /OUT:luac.exe luac.o %TORCH_LUA_VERSION%-static.lib || goto :FAIL + copy /y lua.hpp %TORCH_INSTALL_INC%\lua.hpp + set LUA_CMD=%TORCH_INSTALL_DIR%\lua.cmd + set LUAC_CMD=%TORCH_INSTALL_DIR%\luac.cmd +) +copy /y *.exe %TORCH_INSTALL_BIN%\ +copy /y *.dll %TORCH_INSTALL_BIN%\ +copy /y *.lib %TORCH_INSTALL_LIB%\ +for %%g in (lua.h,luaconf.h,lualib.h,lauxlib.h) do copy /y %%g %TORCH_INSTALL_INC%\%%g + +:::: install luarocks :::: + +echo %ECHO_PREFIX% Installing luarocks +cd %TORCH_DISTRO%\exe\ +if not exist luarocks\.git git clone https://github.com/keplerproject/luarocks.git luarocks +cd luarocks && ( if "%TORCH_UPDATE_DEPS%" == "1" git pull ) & call install.bat /F /Q /P %TORCH_INSTALL_ROC% /SELFCONTAINED /FORCECONFIG /NOREG /NOADMIN /LUA %TORCH_INSTALL_DIR% || goto :FAIL +for /f %%a in ('dir %TORCH_INSTALL_ROC%\config*.lua /b') do set LUAROCKS_CONFIG=%%a +set LUAROCKS_CONFIG=%TORCH_INSTALL_ROC%\%LUAROCKS_CONFIG% +echo rocks_servers = { >> %LUAROCKS_CONFIG% +echo [[https://raw.githubusercontent.com/torch/rocks/master]], >> %LUAROCKS_CONFIG% +echo [[https://raw.githubusercontent.com/rocks-moonscript-org/moonrocks-mirror/master]] >> %LUAROCKS_CONFIG% +echo } >> %LUAROCKS_CONFIG% + +set LUAROCKS_CMD=%TORCH_INSTALL_DIR%\luarocks.cmd + +:::: install wineditline :::: + +echo %ECHO_PREFIX% Installing wineditline for trepl package +cd %TORCH_DISTRO%\win-files\3rd\ +wget -nc https://sourceforge.net/projects/mingweditline/files/latest --no-check-certificate -O wineditline.zip +7z x wineditline.zip -y >NUL +cd wineditline* +cmake -E make_directory build && cd build && cmake .. -G "NMake Makefiles" -DLIB_SUFFIX="64" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=..\ && nmake install + +:::: install dlfcn-win32 :::: + +echo %ECHO_PREFIX% Installing dlfcn-win32 for thread package +cd %TORCH_DISTRO%\win-files\3rd\ +if not exist dlfcn-win32\.git git clone https://github.com/dlfcn-win32/dlfcn-win32.git +cd dlfcn-win32 && ( if "%TORCH_UPDATE_DEPS%" == "1" git pull ) +cmake -E make_directory build && cd build && cmake .. -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=..\ && nmake install +set WIN_DLFCN_INCDIR=%TORCH_DISTRO:\=\\%\\win-files\\3rd\\dlfcn-win32\\include +set WIN_DLFCN_LIBDIR=%TORCH_DISTRO:\=\\%\\win-files\\3rd\\dlfcn-win32\\lib +copy /y %TORCH_DISTRO%\win-files\3rd\dlfcn-win32\bin\*.dll %TORCH_INSTALL_BIN%\ + +:::: download graphviz :::: + +echo %ECHO_PREFIX% Downloading graphviz for graph package +cd %TORCH_DISTRO%\win-files\3rd\ +wget -nc https://github.com/mahkoCosmo/GraphViz_x64/raw/master/graphviz-2.38_x64.tar.gz --no-check-certificate -O graphviz-2.38_x64.tar.gz +7z x graphviz-2.38_x64.tar.gz -y && 7z x graphviz-2.38_x64.tar -ographviz-2.38_x64 -y >NUL +if not exist %TORCH_INSTALL_BIN%\graphviz md %TORCH_INSTALL_BIN%\graphviz +copy /y %TORCH_DISTRO%\win-files\3rd\graphviz-2.38_x64\bin\ %TORCH_INSTALL_BIN%\graphviz\ + +set NEW_PATH=%NEW_PATH%;%TORCH_INSTALL_BIN%\graphviz + +:::: create cmd utils :::: + +if not "%LUAJIT_CMD%" == "" ( + echo %ECHO_PREFIX% Creating torch-activate.cmd luajit.cmd luarocks.cmd cmake.cmd +) else ( + echo %ECHO_PREFIX% Creating torch-activate.cmd lua.cmd luac.cmd luarocks.cmd cmake.cmd +) + +set NEW_PATH=%TORCH_INSTALL_DIR%;%TORCH_INSTALL_BIN%;%TORCH_INSTALL_ROC%;%TORCH_INSTALL_ROC%\tools;%TORCH_INSTALL_ROC%\systree\bin;%NEW_PATH%;%%PATH%%;; +set NEW_LUA_PATH=%TORCH_INSTALL_ROC%\lua\?.lua;%TORCH_INSTALL_ROC%\lua\?\init.lua;%TORCH_INSTALL_ROC%\systree\share\lua\%TORCH_LUAROCKS_LUA%\?.lua;%TORCH_INSTALL_ROC%\systree\share\lua\%TORCH_LUAROCKS_LUA%\?\init.lua;; +set NEW_LUA_CPATH=%TORCH_INSTALL_ROC%\systree\lib\lua\%TORCH_LUAROCKS_LUA%\?.dll;; + +set TORCHACTIVATE_CMD=%TORCH_INSTALL_DIR%\torch-activate.cmd +if exist %TORCHACTIVATE_CMD% del %TORCHACTIVATE_CMD% +echo @echo off>> %TORCHACTIVATE_CMD% +echo set TORCH_INSTALL_DIR=%TORCH_INSTALL_DIR%>> %TORCHACTIVATE_CMD% +echo set TORCH_CONDA_ENV=%TORCH_CONDA_ENV%>> %TORCHACTIVATE_CMD% +echo set TORCH_VS_VERSION=%TORCH_VS_VERSION%>> %TORCHACTIVATE_CMD% +echo set TORCH_VS_PLATFORM=%TORCH_VS_PLATFORM%>> %TORCHACTIVATE_CMD% +echo for /f "delims=" %%%%i in ('call echo %%%%VS%TORCH_VS_VERSION%0COMNTOOLS%%%%') do call "%%%%i..\..\VC\vcvarsall.bat" %TORCH_VS_PLATFORM%>> %TORCHACTIVATE_CMD% +echo set PATH=%NEW_PATH%>> %TORCHACTIVATE_CMD% +echo set LUA_PATH=%NEW_LUA_PATH%>> %TORCHACTIVATE_CMD% +echo set LUA_CPATH=%NEW_LUA_CPATH%>> %TORCHACTIVATE_CMD% +if not "%CUDNN_PATH%" == "" echo set CUDNN_PATH=%CUDNN_PATH%>> %TORCHACTIVATE_CMD% + +if not "%LUAJIT_CMD%" == "" ( + if exist "%LUAJIT_CMD%" del %LUAJIT_CMD% + echo @echo off>> "%LUAJIT_CMD%" + echo setlocal>> "%LUAJIT_CMD%" + echo call %TORCHACTIVATE_CMD%>> "%LUAJIT_CMD%" + echo %TORCH_INSTALL_DIR%\bin\luajit.exe %%*>> "%LUAJIT_CMD%" + echo endlocal>> "%LUAJIT_CMD%" +) + +if not "%LUA_CMD%" == "" ( + if exist "%LUA_CMD%" del %LUA_CMD% + echo @echo off>> "%LUA_CMD%" + echo setlocal>> "%LUA_CMD%" + echo call %TORCHACTIVATE_CMD%>> "%LUA_CMD%" + echo %TORCH_INSTALL_DIR%\bin\lua.exe %%*>> "%LUA_CMD%" + echo endlocal>> "%LUA_CMD%" +) + +if not "%LUAC_CMD%" == "" ( + if exist "%LUAC_CMD%" del %LUAC_CMD% + echo @echo off>> "%LUAC_CMD%" + echo setlocal>> "%LUAC_CMD%" + echo call %TORCHACTIVATE_CMD%>> "%LUAC_CMD%" + echo %TORCH_INSTALL_DIR%\bin\luac.exe %%*>> "%LUAC_CMD%" + echo endlocal>> "%LUAC_CMD%" +) + +if exist %LUAROCKS_CMD% del %LUAROCKS_CMD% +echo @echo off>> %LUAROCKS_CMD% +echo setlocal>> %LUAROCKS_CMD% +echo call %TORCHACTIVATE_CMD%>> %LUAROCKS_CMD% +echo call %TORCH_INSTALL_DIR%\luarocks\luarocks.bat %%*>> %LUAROCKS_CMD% +echo endlocal>> %LUAROCKS_CMD% + +set CMAKE_CMD=%TORCH_INSTALL_DIR%\cmake.cmd +if exist %CMAKE_CMD% del %CMAKE_CMD% +echo @echo off>> %CMAKE_CMD% +echo if "%%1" == ".." if not "%%2" == "-G" goto :G_NMake>> %CMAKE_CMD% +echo cmake.exe %%*>> %CMAKE_CMD% +echo goto :EOF>> %CMAKE_CMD% +echo :G_NMake>> %CMAKE_CMD% +echo shift>> %CMAKE_CMD% +echo cmake.exe .. -G "NMake Makefiles" %%*>> %CMAKE_CMD% + +set TORCH_SETUP_FAIL=0 +echo %ECHO_PREFIX% Setup succeed! +goto :END + +:FAIL +echo %ECHO_PREFIX% Setup fail! + +:END diff --git a/install.bat b/install.bat new file mode 100644 index 0000000..a399322 --- /dev/null +++ b/install.bat @@ -0,0 +1,69 @@ +@setlocal enableextensions +@echo off + +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:::: This script instals Torch7 on windows with msvc :::: +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + + +if not "%TORCH_SETUP_FAIL%" == "0" call install-deps.bat +if not "%TORCH_SETUP_FAIL%" == "0" goto :FAIL + +echo %ECHO_PREFIX% Updating submodules +git submodule update --init --recursive + +set PATCH_DIR=%TORCH_DISTRO%\win-files\patch + +echo %ECHO_PREFIX% Installing common lua packages +cd %TORCH_DISTRO%\extra\luafilesystem && call %LUAROCKS_CMD% make rockspecs\luafilesystem-1.6.3-1.rockspec || goto :FAIL +cd %TORCH_DISTRO%\extra\penlight && call %LUAROCKS_CMD% make penlight-scm-1.rockspec || goto :FAIL +cd %TORCH_DISTRO%\extra\lua-cjson && git apply %PATCH_DIR%\lua-cjson.patch --whitespace=fix & ( call %LUAROCKS_CMD% make lua-cjson-2.1devel-1.rockspec || goto :FAIL ) & git apply %PATCH_DIR%\lua-cjson.patch --reverse --whitespace=fix + +echo %ECHO_PREFIX% Installing core Torch7 packages +cd %TORCH_DISTRO%\extra\luaffifb && git apply %PATCH_DIR%\luaffifb.patch --whitespace=fix & ( call %LUAROCKS_CMD% make luaffi-scm-1.rockspec || goto :FAIL ) & git apply %PATCH_DIR%\luaffifb.patch --reverse --whitespace=fix +cd %TORCH_DISTRO%\pkg\sundown && call %LUAROCKS_CMD% make rocks\sundown-scm-1.rockspec || goto :FAIL +cd %TORCH_DISTRO%\pkg\cwrap && call %LUAROCKS_CMD% make rocks\cwrap-scm-1.rockspec || goto :FAIL +cd %TORCH_DISTRO%\pkg\paths && call %LUAROCKS_CMD% make rocks\paths-scm-1.rockspec || goto :FAIL +if "%TORCH_SETUP_HAS_MKL%" == "1" ( + cd %TORCH_DISTRO%\pkg\torch && git apply %PATCH_DIR%\torch.patch --whitespace=fix & ( call %LUAROCKS_CMD% make rocks\torch-scm-1.rockspec INTEL_MKL_DIR="%INTEL_MKL_DIR%" INTEL_COMPILER_DIR="%INTEL_COMPILER_DIR%" || goto :FAIL ) & git apply %PATCH_DIR%\torch.patch --reverse --whitespace=fix +) else ( + cd %TORCH_DISTRO%\pkg\torch && git apply %PATCH_DIR%\torch.patch --whitespace=fix & ( call %LUAROCKS_CMD% make rocks\torch-scm-1.rockspec BLAS_LIBRARIES="%BLAS_LIBRARIES%" LAPACK_LIBRARIES="%LAPACK_LIBRARIES%" LAPACK_FOUND=TRUE || goto :FAIL ) & git apply %PATCH_DIR%\torch.patch --reverse --whitespace=fix +) +cd %TORCH_DISTRO%\pkg\dok && call %LUAROCKS_CMD% make rocks\dok-scm-1.rockspec || goto :FAIL +cd %TORCH_DISTRO%\exe\trepl && call %LUAROCKS_CMD% make trepl-scm-1.rockspec || goto :FAIL +cd %TORCH_DISTRO%\pkg\sys && call %LUAROCKS_CMD% make sys-1.1-0.rockspec || goto :FAIL +cd %TORCH_DISTRO%\pkg\xlua && call %LUAROCKS_CMD% make xlua-1.0-0.rockspec || goto :FAIL +cd %TORCH_DISTRO%\extra\nn && call %LUAROCKS_CMD% make rocks\nn-scm-1.rockspec || goto :FAIL +cd %TORCH_DISTRO%\extra\graph && call %LUAROCKS_CMD% make rocks\graph-scm-1.rockspec || goto :FAIL +cd %TORCH_DISTRO%\extra\nngraph && call %LUAROCKS_CMD% make nngraph-scm-1.rockspec || goto :FAIL +cd %TORCH_DISTRO%\pkg\image && call %LUAROCKS_CMD% make image-1.1.alpha-0.rockspec || goto :FAIL +cd %TORCH_DISTRO%\pkg\optim && call %LUAROCKS_CMD% make optim-1.0.5-0.rockspec || goto :FAIL + +if not "%TORCH_SETUP_HAS_CUDA%" == "" if not "%TORCH_VS_TARGET%" == "x86" ( + echo %ECHO_PREFIX% Found CUDA on your machine. Installing CUDA packages + cd %TORCH_DISTRO%\extra\cutorch && call %LUAROCKS_CMD% make rocks\cutorch-scm-1.rockspec || goto :FAIL + cd %TORCH_DISTRO%\extra\cunn && git apply %TORCH_DISTRO%\win-files\patch\cunn.patch --whitespace=fix & ( call %LUAROCKS_CMD% make rocks\cunn-scm-1.rockspec || goto :FAIL ) & git apply %TORCH_DISTRO%\win-files\patch\cunn.patch --reverse --whitespace=fix +) + +echo %ECHO_PREFIX% Installing optional Torch7 packages +cd %TORCH_DISTRO%\pkg\gnuplot && call %LUAROCKS_CMD% make rocks\gnuplot-scm-1.rockspec +cd %TORCH_DISTRO%\exe\env && call %LUAROCKS_CMD% make env-scm-1.rockspec +cd %TORCH_DISTRO%\extra\nnx && call %LUAROCKS_CMD% make nnx-0.1-1.rockspec +cd %TORCH_DISTRO%\exe\qtlua && call %LUAROCKS_CMD% make rocks\qtlua-scm-1.rockspec +cd %TORCH_DISTRO%\pkg\qttorch && call %LUAROCKS_CMD% make rocks\qttorch-scm-1.rockspec +cd %TORCH_DISTRO%\extra\threads && call %LUAROCKS_CMD% make rocks\threads-scm-1.rockspec WIN_DLFCN_INCDIR=%WIN_DLFCN_INCDIR% WIN_DLFCN_LIBDIR=%WIN_DLFCN_LIBDIR% +cd %TORCH_DISTRO%\extra\argcheck && call %LUAROCKS_CMD% make rocks\argcheck-scm-1.rockspec + +if not "%TORCH_SETUP_HAS_CUDA%" == "" if not "%TORCH_VS_TARGET%" == "x86" ( + echo %ECHO_PREFIX% Found CUDA on your machine. Installing optional CUDA packages + cd %TORCH_DISTRO%\extra\cudnn && git apply %TORCH_DISTRO%\win-files\patch\cudnn.patch --whitespace=fix & call %LUAROCKS_CMD% make cudnn-scm-1.rockspec & git apply %TORCH_DISTRO%\win-files\patch\cudnn.patch --reverse --whitespace=fix +) + +echo %ECHO_PREFIX% Installation succeed! +goto :END + +:FAIL +echo %ECHO_PREFIX% Installation error! + +:END +@endlocal diff --git a/test.bat b/test.bat new file mode 100644 index 0000000..a100e67 --- /dev/null +++ b/test.bat @@ -0,0 +1,88 @@ +@setlocal enableextensions +@echo off + +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:::: This script tests if Torch7 is installed properly :::: +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + + +if "%TORCH_INSTALL_DIR%" == "" goto :HELP + +for /f "delims=" %%i in ('where luajit.cmd') do ( + set LUA=%%i + goto :AFTER_LUAJIT +) + +:AFTER_LUAJIT +if exist "%LUA%" ( + set TORCH_USE_LUAJIT=1 +) else ( + for /f "delims=" %%i in ('where lua.cmd') do ( + set LUA=%%i + goto :AFTER_LUA + ) +) + +:AFTER_LUA +if not exist "%LUA%" ( + echo Neither luajit nor lua found in Torch7 environment + goto :FAIL +) + +set LUA_SAFE_PATH=%LUA:\=\\% +echo Using Lua at: %LUA% + +:: smoke tests +call %LUA% -lpaths -e "print('paths loaded succesfully')" || goto :FAIL +call %LUA% -ltorch -e "print('torch loaded succesfully')" || goto :FAIL +call %LUA% -lenv -e "print('env loaded succesfully')" || goto :FAIL +call %LUA% -ltrepl -e "print('trepl loaded succesfully')" || goto :FAIL +call %LUA% -ldok -e "print('dok loaded succesfully')" || goto :FAIL +call %LUA% -limage -e "print('image loaded succesfully')" || goto :FAIL +call %LUA% -lcwrap -e "print('cwrap loaded succesfully')" || goto :FAIL +call %LUA% -lgnuplot -e "print('gnuplot loaded succesfully')" || goto :FAIL +call %LUA% -loptim -e "print('optim loaded succesfully')" || goto :FAIL +call %LUA% -lsys -e "print('sys loaded succesfully')" || goto :FAIL +for /f "delims=" %%i in ('where basename') do set BASENAME=%%i +if "%BASENAME%" == "" ( + call %LUA% -lxlua -e "print('xlua loaded succesfully')" || goto :FAIL +) else ( + call %LUA% -lxlua -e "print('x$(basename %LUA_SAFE_PATH%) loaded succesfully')" || goto :FAIL +) +call %LUA% -largcheck -e "print('argcheck loaded succesfully')" || goto :FAIL +call %LUA% -lgraph -e "print('graph loaded succesfully')" || goto :FAIL +call %LUA% -lnn -e "print('nn loaded succesfully')" || goto :FAIL +call %LUA% -lnngraph -e "print('nngraph loaded succesfully')" || goto :FAIL +call %LUA% -lnnx -e "print('nnx loaded succesfully')" || goto :FAIL +call %LUA% -lthreads -e "print('threads loaded succesfully')" || goto :FAIL + +call th -ltorch -e "torch.test()" +call th -lnn -e "nn.test()" + +if "%TORCH_USE_LUAJIT%" == "1" ( + call %LUA% -lsundown -e "print('sundown loaded succesfully')" +) + +call %LUA% -lcutorch -e "" +if "%ERRORLEVEL%" == "0" ( + call %LUA% -lcutorch -e "print('cutorch loaded succesfully')" + call %LUA% -lcunn -e "print('cunn loaded succesfully')" + if "%TORCH_USE_LUAJIT%" == "1" %LUA% -lcudnn -e "print('cudnn loaded succesfully')" + call th -lcutorch -e "cutorch.test()" + call th -lcunn -e "nn.testcuda()" +) else ( + echo "CUDA not found" +) + +echo Test succeed +goto :END + +:HELP +echo Please run torch-activate.cmd before run test.bat so that test knows where to find Torch7. +goto :END + +:FAIL +echo Test fail + +:END +@endlocal diff --git a/uninstall.bat b/uninstall.bat new file mode 100644 index 0000000..ed6425a --- /dev/null +++ b/uninstall.bat @@ -0,0 +1,31 @@ +@setlocal enableextensions +@echo off + +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:::: This script [1] cleans temporary compilation file :::: +:::: [2] deletes Torch7 installation directory :::: +:::: [3] deletes Torch7 conda environment :::: +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + + +if "%TORCH_INSTALL_DIR%" == "" goto :HELP + +set ECHO_PREFIX=+++++++ + +echo %ECHO_PREFIX% cleaning temporary compilation files +call clean.bat + +echo %ECHO_PREFIX% deleting Torch7 installation directory +rmdir /s /q %TORCH_INSTALL_DIR% + +echo %ECHO_PREFIX% deleting Torch7 conda environment (even if env is removed, packages will stil be kept in conda/pkgs) +conda env remove -n %TORCH_CONDA_ENV% --yes + +echo %ECHO_PREFIX% Torch7 has been uninstalled +goto :END + +:HELP +echo Please run torch-activate.cmd before run uninstall.bat so that uninstall knows where to find Torch7. + +:END +@endlocal diff --git a/win-files/README.md b/win-files/README.md new file mode 100644 index 0000000..fd46a2c --- /dev/null +++ b/win-files/README.md @@ -0,0 +1,92 @@ +Self-contained Torch installation for windows +============ + +## Prerequisites + +#### Must have +- MSVC, anyone of the following choices is sufficient + - [Visual C++ Build Tools](http://landinghub.visualstudio.com/visual-cpp-build-tools) + - [Visual Studio Express](https://www.visualstudio.com/vs/visual-studio-express/) + - [Visual Studio Community](https://www.visualstudio.com/vs/community/) +- [Git](https://git-scm.com/download/win) +- [CMake](https://cmake.org/download/#latest) +- [Conda](http://conda.pydata.org/docs/download.html), manage dependencies like openblas, jpeg, qt, etc + +#### If use CUDA + +- [CUDA Toolkit](https://developer.nvidia.com/cuda-toolkit) +- [CUDNN](https://developer.nvidia.com/cudnn), if use dnn + +#### Optional + +- [MKL](https://software.intel.com/intel-mkl), better performance blas/lapack library +- [Gnuplot](https://sourceforge.net/projects/gnuplot/files/latest), required by gnuplot package for plotting +- [GraphicsMagick](https://sourceforge.net/projects/graphicsmagick/files/latest), optional for image package + +## Install +Open "Windows Command Prompt" and run: +```bat +install.bat +``` +By default x64 Torch will be installed under install\ with LuaJIT 2.1 and openlblas from conda environment 'torch-vcversion'. +Run install.bat in a specific "VS\* \* Tools Command Prompt" to compile for a different target. Please choose x64 conda +for x64 Torch and x86 conda for x86 Torch. X86 Torch does not contain cuda packages and has 2G memory limitation. +There are a few customizable environment variables listed on top of install-deps.bat. There is no need to run +install-deps.bat before run install.bat, it sets variables in global and it will be called directly by install.bat. +**Do not** use lua instead of luajit because currently lua version Torch will use luaffifb for ffi which has bugs on windows +and has poor performance. + +It is easy to intall multiple Torch by customizing TORCH\_INSTALL\_DIR, TORCH\_LUA\_VERSION, and by making sure +clean.bat is run before running install.bat. + +## Use +In order to use Torch in a Self-contained way, a few helper cmd will be installed under the installation directory: +- torch-activate.cmd: setup Torch environment including TORCH\_INSTALL\_DIR, TORCH\_CONDA\_ENV, TORCH\_VS\_VERSION, TORCH\_VS\_PLATFORM, PATH, LUA\_PATH, LUA\_CPATH, CUDNN\_PATH, +- luajit.cmd: a wrapper of luajit.exe with Torch environment +- luarocks.cmd: a wrapper of luarocks.bat with Torch environment +- cmake.cmd: a wrapper of cmake.exe which helps package installation with MSVC + +#### Use luajit.cmd and luarocks.cmd directly +```bat +path_to_Torch\luajit -ltorch -e "torch.test()" +``` +The installation will remember which MSVC to use for what platform, so luarocks install can be run in a general "Windows +Command Prompt". +```bat +path_to_Torch\luarocks install rnn +``` +It will automatically install not installed dependencies. + +#### Run torch-activate.cmd, then use availabe Torch executables +```bat +path_to_Torch\torch-activate +th +qlua +``` +Trepl on windows should work similarly as on linux or macos. qlua should be used to run qt related lua codes. + +#### Packages + +## Clean or Uninstall +To remove all the temporary compilation files: +```bat +clean.bat +``` + +To remove the installation: +```bat +path_to_Torch\torch-activate +uninstall.bat +``` +torch-activate.cmd is called before uninstall.bat so that uninstall knows which Torch7 to uninstall. +In addition to clean.bat, this will remove the directory pointed to by TORCH\_INSTALL\_DIR and TORCH\_CONDA\_ENV from conda. + +## Test +You can test that all libraries are installed properly by running: +```bat +path_to_Torch\torch-activate +test.bat +``` +torch-activate.cmd is called before test.bat so that test knows which Torch7 to test. + +Tested x64 Torch7 on Windows 10 x64, Visual Studio Community 2015, Anaconda4, Cuda Toolkit8.0, MKL2017 diff --git a/win-files/patch/cudnn.patch b/win-files/patch/cudnn.patch new file mode 100644 index 0000000..b4783d4 --- /dev/null +++ b/win-files/patch/cudnn.patch @@ -0,0 +1,21 @@ +diff --git a/init.lua b/init.lua +index 6c8abd7..322a21d 100644 +--- a/init.lua ++++ b/init.lua +@@ -4,6 +4,7 @@ cudnn = require 'cudnn.env' + require('cudnn.ffi') + local C = cudnn.C + local ffi = require 'ffi' ++local THC = ffi.os == 'Windows' and ffi.load('THC') or ffi.C + + -------------------------------------------------------------------- + -- defaults, each should be overrideable via env var: +@@ -151,7 +152,7 @@ end + + function cudnn.call(f, ...) + C.cudnnSetStream(cudnn.getHandle(), +- ffi.C.THCState_getCurrentStream(cutorch.getState())) ++ THC.THCState_getCurrentStream(cutorch.getState())) + return C[f](...) + end + diff --git a/win-files/patch/cunn.patch b/win-files/patch/cunn.patch new file mode 100644 index 0000000..d143c9b --- /dev/null +++ b/win-files/patch/cunn.patch @@ -0,0 +1,85 @@ +diff --git a/THCUNN.lua b/THCUNN.lua +index 490cd5c..9924944 100644 +--- a/THCUNN.lua ++++ b/THCUNN.lua +@@ -6,6 +6,9 @@ local THCUNN = {} + -- load libTHCUNN + THCUNN.C = ffi.load(package.searchpath('libTHCUNN', package.cpath)) + ++-- load THC ++local THC = ffi.os == 'Windows' and ffi.load('THC') or ffi.C ++ + local THCState_ptr = ffi.typeof('THCState*') + + function THCUNN.getState() +@@ -139,7 +142,7 @@ local transform_reals_to_half = function(func_name, real_args, ...) + end + for k,v in ipairs(real_args[func_name]) do + -- first argument (THCState) is added implicitly by bind +- t[v-1] = ffi.C.THC_float2half(t[v-1]) ++ t[v-1] = THC.THC_float2half(t[v-1]) + end + return t + end +diff --git a/test.lua b/test.lua +index 7cb2854..ea214c3 100644 +--- a/test.lua ++++ b/test.lua +@@ -5,6 +5,9 @@ local precision_backward = 1e-2 + local nloop = 1 + local times = {} + ++-- load THC ++local THC = ffi.os == 'Windows' and ffi.load('THC') or ffi.C ++ + --e.g.: th -lcunn -e "nn.testcuda{'Sigmoid_forward'}" + + local typenames = { +@@ -348,17 +351,17 @@ function cunntest.Square_transposed() + end + + function cunntest.SoftShrink_forward() +- local r = ffi.C.THC_half2float(ffi.C.THC_float2half(math.random())) ++ local r = THC.THC_half2float(THC.THC_float2half(math.random())) + pointwise_forward(nn.SoftShrink(r), 'SoftShrink', precision_forward) + end + + function cunntest.SoftShrink_backward() +- local r = ffi.C.THC_half2float(ffi.C.THC_float2half(math.random())) ++ local r = THC.THC_half2float(THC.THC_float2half(math.random())) + pointwise_backward(nn.SoftShrink(r), 'SoftShrink', precision_backward) + end + + function cunntest.SoftShrink_transposed() +- local r = ffi.C.THC_half2float(ffi.C.THC_float2half(math.random())) ++ local r = THC.THC_half2float(THC.THC_float2half(math.random())) + pointwise_transposed(nn.SoftShrink(r), 'SoftShrink', precision_backward) + end + +@@ -3377,7 +3380,7 @@ function cunntest.mse() + local cgin = cmod:backward(cinput,ctarget) + + if (typename == 'torch.CudaHalfTensor') then +- fout = ffi.C.THC_half2float(ffi.C.THC_float2half(fout)) ++ fout = THC.THC_half2float(THC.THC_float2half(fout)) + end + mytester:assertlt(math.abs(fout-cout), precision_forward_type(0.02, typename), + string.format('error on output with %s', typename)) +@@ -3411,7 +3414,7 @@ function cunntest.SmoothL1() + local cgin = cmod:backward(cinput,ctarget) + + if (typename == 'torch.CudaHalfTensor') then +- fout = ffi.C.THC_half2float(ffi.C.THC_float2half(fout)) ++ fout = THC.THC_half2float(THC.THC_float2half(fout)) + end + mytester:assertlt(math.abs(fout-cout), 0.01, string.format('error on output with %s', typename)) + local gerr = cgin:double() - fgin:double() +@@ -3976,7 +3979,7 @@ function cunntest.l1cost() + local cgin = cmod:backward(cinput) + + if (typename == 'torch.CudaHalfTensor') then +- fout = ffi.C.THC_half2float(ffi.C.THC_float2half(fout)) ++ fout = THC.THC_half2float(THC.THC_float2half(fout)) + end + mytester:assertlt(math.abs(fout-cout), precision_forward_type(precision_forward, typename), + string.format('error on output with %s', typename)) diff --git a/win-files/patch/lua-cjson.patch b/win-files/patch/lua-cjson.patch new file mode 100644 index 0000000..47cd370 --- /dev/null +++ b/win-files/patch/lua-cjson.patch @@ -0,0 +1,67 @@ +diff --git a/fpconv.h b/fpconv.h +index 7b0d0ee..f674e41 100644 +--- a/fpconv.h ++++ b/fpconv.h +@@ -4,6 +4,10 @@ + * + * Longest double printed with %.14g is 21 characters long: + * -1.7976931348623e+308 */ ++#ifdef _MSC_VER ++#define inline __inline ++#define snprintf _snprintf ++#endif + # define FPCONV_G_FMT_BUFSIZE 32 + + #ifdef USE_INTERNAL_FPCONV +diff --git a/lua-cjson-2.1devel-1.rockspec b/lua-cjson-2.1devel-1.rockspec +index 154e333..0f7652e 100644 +--- a/lua-cjson-2.1devel-1.rockspec ++++ b/lua-cjson-2.1devel-1.rockspec +@@ -47,6 +47,7 @@ build = { + -- Override default build options (per platform) + platforms = { + win32 = { modules = { cjson = { defines = { ++ "strncasecmp=_strnicmp", + "DISABLE_INVALID_NUMBERS" + } } } } + }, +diff --git a/strbuf.c b/strbuf.c +index ac779e4..c3272f0 100644 +--- a/strbuf.c ++++ b/strbuf.c +@@ -94,8 +94,8 @@ void strbuf_set_increment(strbuf_t *s, int increment) + static inline void debug_stats(strbuf_t *s) + { + if (s->debug) { +- fprintf(stderr, "strbuf(%lx) reallocs: %d, length: %d, size: %d\n", +- (long)s, s->reallocs, s->length, s->size); ++ fprintf(stderr, "strbuf(%p) reallocs: %d, length: %d, size: %d\n", ++ s, s->reallocs, s->length, s->size); + } + } + +@@ -168,8 +168,8 @@ void strbuf_resize(strbuf_t *s, int len) + newsize = calculate_new_size(s, len); + + if (s->debug > 1) { +- fprintf(stderr, "strbuf(%lx) resize: %d => %d\n", +- (long)s, s->size, newsize); ++ fprintf(stderr, "strbuf(%p) resize: %d => %d\n", ++ s, s->size, newsize); + } + + s->size = newsize; +diff --git a/strbuf.h b/strbuf.h +index d861108..b135560 100644 +--- a/strbuf.h ++++ b/strbuf.h +@@ -24,6 +24,9 @@ + + #include <stdlib.h> + #include <stdarg.h> ++#ifdef _MSC_VER ++#define inline __inline ++#endif + + /* Size: Total bytes allocated to *buf + * Length: String length, excluding optional NULL terminator. diff --git a/win-files/patch/luaffifb.patch b/win-files/patch/luaffifb.patch new file mode 100644 index 0000000..988883f --- /dev/null +++ b/win-files/patch/luaffifb.patch @@ -0,0 +1,189 @@ +diff --git a/ffi.h b/ffi.h +index dabdc9b..d457fd7 100644 +--- a/ffi.h ++++ b/ffi.h +@@ -42,8 +42,10 @@ extern "C" { + #include <sys/mman.h> + #endif + ++#ifndef _MSC_VER + #include <complex.h> + #define HAVE_COMPLEX ++#endif + #define HAVE_LONG_DOUBLE + + #ifndef NDEBUG +diff --git a/test.c b/test.c +index 20f5d13..c9acb27 100644 +--- a/test.c ++++ b/test.c +@@ -19,8 +19,12 @@ + #include <errno.h> + #endif + ++#ifndef _MSC_VER + #include <complex.h> + #define HAVE_COMPLEX ++#else ++#include <lua.h> ++#endif + + #ifdef __cplusplus + # define EXTERN_C extern "C" +@@ -718,3 +722,9 @@ void test_call_pppppiiifii(void* p1, void* p2, void* p3, void* p4, void* p5, int + sprintf(buf, "%p %p %p %p %p %d %d %d %0.1f %d %d", p1, p2, p3, p4, p5, i1, i2, i3, f4, i5, i6); + } + ++#ifdef _MSC_VER ++int luaopen_ffi_libtest(lua_State* L) ++{ ++ return 1; ++} ++#endif +diff --git a/test.lua b/test.lua +index 8a9b718..af05ea7 100644 +--- a/test.lua ++++ b/test.lua +@@ -7,6 +7,15 @@ + -- of patent rights can be found in the PATENTS file in the same directory. + -- + io.stdout:setvbuf('no') ++ ++local is_luajit = false ++if type(jit) == 'table' then ++ is_luajit = string.find(jit.version, 'LuaJIT') ++ if is_luajit then ++ package.preload['ffi'] = nil -- enable run test in luajit ++ end ++end ++ + local ffi = require 'ffi' + local dlls = {} + +@@ -322,17 +331,29 @@ local types = { + e32 = 'enum e32', + } + ++-- different compilers may printf(%p) in different format, ++-- for example 000000003A0A9848, 0x3a0a9848 ++-- tostring(cdata) may return address with '0x' prefix ++local addrbuf = ffi.new('char[256]') ++local function unifyaddr(ttype, addr) ++ if ttype == 'void*' then ++ dlls.__cdecl.print_p(addrbuf, tonumber(addr, 16)) ++ return ffi.string(addrbuf) ++ end ++ return addr ++end ++ + local buf = ffi.new('char[256]') + + local function checkbuf(type, ret, msg) +- local str = tostring(test_values[type]):gsub('^cdata%b<>: ', '') ++ local str = unifyaddr(type, tostring(test_values[type]):gsub('^cdata%b<>: ', '')) + check(ffi.string(buf), str, msg) + check(ret, #str, msg) + end + + local function checkalign(type, v, ret) + --print(v) +- local str = tostring(test_values[type]):gsub('^cdata%b<>: ', '') ++ local str = unifyaddr(type, tostring(test_values[type]):gsub('^cdata%b<>: ', '')) + check(ffi.string(buf), ('size %d offset %d align %d value %s'):format(ffi.sizeof(v), ffi.offsetof(v, 'v'), ffi.alignof(v, 'v'), str)) + check(ret, #str) + end +@@ -593,9 +614,13 @@ for convention,c in pairs(dlls) do + + check(c.call_fptr({function(a) return 3*a end}, 5), 15) + ++ if is_luajit then ++ print('luajit+ffifb failure : pcall error test') ++ else + local suc, err = pcall(c.call_s, function(s) error(ffi.string(s), 0) end, 'my error') + check(suc, false) + check(err, 'my error') ++ end + + check(ffi.errno(), c.get_errno()) + c.set_errno(3) +@@ -628,7 +653,7 @@ for convention,c in pairs(dlls) do + first = false + end + +-local c = ffi.C ++local c = ffi.os=='Windows' and ffi.load('msvcrt') or ffi.C + + assert(c.sprintf(buf, "%g", 5.3) == 3 and ffi.string(buf) == '5.3') + assert(c.sprintf(buf, "%d", false) == 1 and ffi.string(buf) == '0') +@@ -927,31 +952,40 @@ void test_call_pppppiifiii(void* p1, void* p2, void* p3, void* p4, void* p5, int + void test_call_pppppiiifii(void* p1, void* p2, void* p3, void* p4, void* p5, int i1, int i2, int i3, float i4, int i5, int i6); + ]] + +-ffi.C.test_call_echo("input") +-assert(ffi.C.buf == "input") ++local ffiC = ffi.os=='Windows' and dlls.__cdecl or ffi.C ++ffiC.test_call_echo("input") ++assert(ffiC.buf == "input") + + local function ptr(x) return ffi.new('void*', x) end ++local prefix = "" ++for i=1,5 do prefix = prefix .. unifyaddr('void*', tostring(i)) .. " " end + +-ffi.C.test_call_pppppii(ptr(1), ptr(2), ptr(3), ptr(4), ptr(5), 6, 7) +-assert(ffi.C.buf == "0x1 0x2 0x3 0x4 0x5 6 7") ++ffiC.test_call_pppppii(ptr(1), ptr(2), ptr(3), ptr(4), ptr(5), 6, 7) ++assert(ffiC.buf == prefix .. "6 7") + +-ffi.C.test_call_pppppiiiiii(ptr(1), ptr(2), ptr(3), ptr(4), ptr(5), 6, 7, 8, 9, 10, 11) +-assert(ffi.C.buf == "0x1 0x2 0x3 0x4 0x5 6 7 8 9 10 11") ++ffiC.test_call_pppppiiiiii(ptr(1), ptr(2), ptr(3), ptr(4), ptr(5), 6, 7, 8, 9, 10, 11) ++assert(ffiC.buf == prefix .. "6 7 8 9 10 11") + +-ffi.C.test_call_pppppffffff(ptr(1), ptr(2), ptr(3), ptr(4), ptr(5), 6.5, 7.5, 8.5, 9.5, 10.5, 11.5) +-assert(ffi.C.buf == "0x1 0x2 0x3 0x4 0x5 6.5 7.5 8.5 9.5 10.5 11.5") ++if is_luajit then ++ print("luajit+ffifb failure : function call with float parameters test") ++else ++ffiC.test_call_pppppffffff(ptr(1), ptr(2), ptr(3), ptr(4), ptr(5), 6.5, 7.5, 8.5, 9.5, 10.5, 11.5) ++assert(ffiC.buf == prefix .. "6.5 7.5 8.5 9.5 10.5 11.5") + +-ffi.C.test_call_pppppiifiii(ptr(1), ptr(2), ptr(3), ptr(4), ptr(5), 6, 7, 8.5, 9, 10, 11) +-assert(ffi.C.buf == "0x1 0x2 0x3 0x4 0x5 6 7 8.5 9 10 11") ++ffiC.test_call_pppppiifiii(ptr(1), ptr(2), ptr(3), ptr(4), ptr(5), 6, 7, 8.5, 9, 10, 11) ++assert(ffiC.buf == prefix .. "6 7 8.5 9 10 11") + +-ffi.C.test_call_pppppiiifii(ptr(1), ptr(2), ptr(3), ptr(4), ptr(5), 6, 7, 8, 9.5, 10, 11) +-assert(ffi.C.buf == "0x1 0x2 0x3 0x4 0x5 6 7 8 9.5 10 11") ++ffiC.test_call_pppppiiifii(ptr(1), ptr(2), ptr(3), ptr(4), ptr(5), 6, 7, 8, 9.5, 10, 11) ++assert(ffiC.buf == prefix .. "6 7 8 9.5 10 11") ++end + +-local sum = ffi.C.add_dc(ffi.new('complex', 1, 2), ffi.new('complex', 3, 5)) ++if not ffiC.is_msvc then ++local sum = ffiC.add_dc(ffi.new('complex', 1, 2), ffi.new('complex', 3, 5)) + assert(ffi.istype('complex', sum)) + +-sum = ffi.C.add_fc(ffi.new('complex float', 1, 2), ffi.new('complex float', 3, 5)) ++sum = ffiC.add_fc(ffi.new('complex float', 1, 2), ffi.new('complex float', 3, 5)) + assert(ffi.istype('complex float', sum)) ++end + + ffi.cdef [[ + struct Arrays { +@@ -988,6 +1022,9 @@ assert(ffi.string(buf, 0) == '') + assert(ffi.string(buf, ffi.new('long long', 2)) == 'aa') + assert(ffi.string(buf, ffi.new('int', 2)) == 'aa') + ++if is_luajit then ++ print("luajit+ffifb failure : tmpfile test") ++else + -- Test io.tmpfile() + ffi.cdef [[ + int fprintf ( FILE * stream, const char * format, ... ); +@@ -999,5 +1036,6 @@ f:seek("set", 0) + local str = f:read('*l') + assert(str == 'test: foo', str) + f:close() ++end + + print('Test PASSED') diff --git a/win-files/patch/torch.patch b/win-files/patch/torch.patch new file mode 100644 index 0000000..63e7868 --- /dev/null +++ b/win-files/patch/torch.patch @@ -0,0 +1,26 @@ +diff --git a/lib/luaT/luaT.c b/lib/luaT/luaT.c +index 95166ed..2dc307a 100644 +--- a/lib/luaT/luaT.c ++++ b/lib/luaT/luaT.c +@@ -151,7 +151,7 @@ const char* luaT_newlocalmetatable(lua_State *L, const char *tname, const char * + { + lua_pushcfunction(L, luaT_lua_newmetatable); + lua_pushstring(L, tname); +- (parent_tname ? lua_pushstring(L, parent_tname) : lua_pushnil(L)); ++ (parent_tname ? (void)lua_pushstring(L, parent_tname) : lua_pushnil(L)); + (constructor ? lua_pushcfunction(L, constructor) : lua_pushnil(L)); + (destructor ? lua_pushcfunction(L, destructor) : lua_pushnil(L)); + (factory ? lua_pushcfunction(L, factory) : lua_pushnil(L)); +diff --git a/rocks/torch-scm-1.rockspec b/rocks/torch-scm-1.rockspec +index 2228726..30df777 100644 +--- a/rocks/torch-scm-1.rockspec ++++ b/rocks/torch-scm-1.rockspec +@@ -27,7 +27,7 @@ cmake -E make_directory build && cd build && cmake .. -DCMAKE_BUILD_TYPE=Release + platforms = { + windows = { + build_command = [[ +-cmake -E make_directory build && cd build && cmake .. -DCMAKE_BUILD_TYPE=Release -DLUA=$(LUA) -DLUALIB=$(LUALIB) -DLUA_BINDIR="$(LUA_BINDIR)" -DLUA_INCDIR="$(LUA_INCDIR)" -DLUA_LIBDIR="$(LUA_LIBDIR)" -DLUADIR="$(LUADIR)" -DLIBDIR="$(LIBDIR)" -DCMAKE_INSTALL_PREFIX="$(PREFIX)" && $(MAKE) ++cmake -E make_directory build && cd build && cmake .. -DINTEL_MKL_DIR=$(INTEL_MKL_DIR) -DINTEL_COMPILER_DIR=$(INTEL_COMPILER_DIR) -DBLAS_LIBRARIES=$(BLAS_LIBRARIES) -DLAPACK_LIBRARIES=$(LAPACK_LIBRARIES) -DLAPACK_FOUND=$(LAPACK_FOUND) -DCMAKE_BUILD_TYPE=Release -DLUA=$(LUA) -DLUALIB=$(LUALIB) -DLUA_BINDIR="$(LUA_BINDIR)" -DLUA_INCDIR="$(LUA_INCDIR)" -DLUA_LIBDIR="$(LUA_LIBDIR)" -DLUADIR="$(LUADIR)" -DLIBDIR="$(LIBDIR)" -DCMAKE_INSTALL_PREFIX="$(PREFIX)" && $(MAKE) + ]] + } + }, diff --git a/win-files/test/ffifb_perf_ffi.lua b/win-files/test/ffifb_perf_ffi.lua new file mode 100644 index 0000000..9056f27 --- /dev/null +++ b/win-files/test/ffifb_perf_ffi.lua @@ -0,0 +1,37 @@ +-- code from http://luajit.org/ext_ffi.html + +require 'torch' + +local t = torch.Timer() +t:reset() + +local ffi = require("ffi") +ffi.cdef[[ +typedef struct { uint8_t red, green, blue, alpha; } rgba_pixel; +]] + +local function image_ramp_green(n) + local img = ffi.new("rgba_pixel[?]", n) + local f = 255/(n-1) + for i=0,n-1 do + img[i].green = i*f + img[i].alpha = 255 + end + return img +end + +local function image_to_grey(img, n) + for i=0,n-1 do + local y = 0.3*img[i].red + 0.59*img[i].green + 0.11*img[i].blue + img[i].red = y; img[i].green = y; img[i].blue = y + end +end + +local N = 400*400 +local img = image_ramp_green(N) +for i=1,1000 do + image_to_grey(img, N) +end + +t:stop() +print(t:time().real) diff --git a/win-files/test/ffifb_perf_purelua.lua b/win-files/test/ffifb_perf_purelua.lua new file mode 100644 index 0000000..238aa65 --- /dev/null +++ b/win-files/test/ffifb_perf_purelua.lua @@ -0,0 +1,33 @@ +-- code from http://luajit.org/ext_ffi.html + +require 'torch' + +local t = torch.Timer() +t:reset() + +local floor = math.floor + +local function image_ramp_green(n) + local img = {} + local f = 255/(n-1) + for i=1,n do + img[i] = { red = 0, green = floor((i-1)*f), blue = 0, alpha = 255 } + end + return img +end + +local function image_to_grey(img, n) + for i=1,n do + local y = floor(0.3*img[i].red + 0.59*img[i].green + 0.11*img[i].blue) + img[i].red = y; img[i].green = y; img[i].blue = y + end +end + +local N = 400*400 +local img = image_ramp_green(N) +for i=1,1000 do + image_to_grey(img, N) +end + +t:stop() +print(t:time().real) |