[Numpy-discussion] Compile NumPy with ifort, MSVC and MKL - DLL load failed

Christoph Gohlke cgohlke at uci.edu
Mon Feb 15 11:34:36 EST 2021


Hello,

On 2/15/2021 7:38 AM, Pietro Fontana wrote:
> Hi all,
> 
> I've been trying to compile NumPy from source on Windows 10, with MSVC 
> compiler and Intel MKL. Whenever I link to MKL it fails at loading DLLs.
> I am running Windows 10.0.18363 with Microsoft Visual Studio 2019 
> (16.8.5) and Intel MKL 2017.8.275.
> 
> I managed to reproduce the issue with a minimal setup, using latest 
> Python and NumPy.
> 
>  1. Download latest Python (3.9.1) and latest NumPy (1.20.1) source.
>  2. Open a VS command prompt, unpack Python source, build with
>     PCbuild\build.bat
>  3. Run mklvars.bat intel64 to get the right environment variables set.
>  4. Add the Intel compilers (needed for ifort) to PATH:
> 
> set PATH=C:\Program Files 
> (x86)\IntelSWTools\compilers_and_libraries_2017\windows\bin\intel64;%PATH%
> 
>  5. Create a virtual env, copy a few files from the Python build and
>     activate the virtual env:
> 
> copy Python\PCbuild\amd64\python39.dll venv\Scripts
> copy Python\PC\pyconfig.h venv\Include
> 
>  6. Build NumPy from source and install: pip install . -v
>  7. Try to import NumPy: python -c "import numpy"
> 
> The error message appears as follows:
> 
> |Traceback (most recent |call||last|):|
> 
> ||File||"C:\path\numpy_clean_env\venv\lib\site-packages\numpy\core\__init__.py"|, line 
> |22|, |in|<|module|>|
> 
> ||from|. |import|multiarray|
> 
> ||File||"C:\path\numpy_clean_env\venv\lib\site-packages\numpy\core\multiarray.py"|, 
> line |12|, |in|<|module|>|
> 
> ||from|. |import|overrides|
> 
> ||File||"C:\path\numpy_clean_env\venv\lib\site-packages\numpy\core\overrides.py"|, 
> line |7|, |in|<|module|>|
> 
> ||from|numpy.core._multiarray_umath |import|(|
> 
> |ImportError: DLL |load||failed||while|importing _multiarray_umath: The specified |module|could |not|be found.|
> 
> ||
> 
> |During handling |of|the above |exception|, another |exception|occurred:|
> 
> ||
> 
> |Traceback (most recent |call||last|):|
> 
> ||File||"<string>"|, line |1|, |in|<|module|>|
> 
> ||File||"C:\path\numpy_clean_env\venv\lib\site-packages\numpy\__init__.py"|, line |145|, |in|<|module|>|
> 
> ||from|. |import|core|
> 
> ||File||"C:\path\numpy_clean_env\venv\lib\site-packages\numpy\core\__init__.py"|, line 
> |48|, |in|<|module|>|
> 
> ||raise|ImportError(msg)|
> 
> |ImportError:|
> 
> |[… useful suggestions that however did not lead to a solution…]|
> 
> |Original |error|was: DLL |load||failed||while|importing _multiarray_umath: The specified |module|could |not|be found.|
> 
>   
> 
> The MKL libraries are picked up during compilation since it returns:
> 
> |FOUND:|
> 
> |        libraries = [|'mkl_rt'|]|
> 
> |        library_dirs = [|'C:\\Program Files 
> (x86)\\IntelSWTools\\compilers_and_libraries\\windows\\mkl\\lib\\intel64'|]|
> 
> |        define_macros = [(|'SCIPY_MKL_H'|, |None|), (|'HAVE_CBLAS'|, |None|)]|
> 
> |        include_dirs = [|'C:\\Program Files 
> (x86)\\IntelSWTools\\compilers_and_libraries\\windows\\mkl'|, |'C:\\Program Files 
> (x86)\\IntelSWTools\\compilers_and_libraries\\windows\\mkl\\include'|, |'C:\\Program Files 
> (x86)\\IntelSWTools\\compilers_and_libraries\\windows\\mkl\\lib'|]|
> 
> I tried to analyze the DLL resolution on |_multiarray_umath.pyd| with 
> Dependencies (the newer version of Dependency Walker) but it seems that 
> the MKL DLL loads fine. There are some DLLs that appear as not correctly 
> loaded, but as far as I understand it is caused by the inspection 
> software limit with Windows API sets (api-ms-win-core-*, 
> ext-ms-onecore-*, ext-ms-win-*, and similar), not by actual problems 
> with this DLLs, so I think the system is correctly setup.
> 
> If I skip the initialization of MKL environment variables, then the MKL 
> libraries are not picked and NumPy is compiled to a functional state.
> 
> In the past this setup used to work with Python 3.6, VS2015 and a 
> similar version of Intel MKL.
> I was able to reproduce the issue with NumPy 1.16.2, 1.17 and 1.20.1; 
> with Python 3.8.6 and Python 3.9.1; with Intel MKL 2017 and oneAPI 2020.
> 
> Am I missing any obvious step to succeed in this adventure?
> 
> 

Python >= 3.8 will no longer use PATH for resolving dependencies of 
extension modules. Use os.add_dll_directory(mkl_bin_path) 
<https://docs.python.org/3/library/os.html#os.add_dll_directory> in all 
your scripts before importing numpy or add the call to a 
_distributor_init.py file in the numpy package directory.

Christoph


More information about the NumPy-Discussion mailing list