【发布时间】:2021-05-27 01:20:17
【问题描述】:
我在窗户下。 mkl_example.f中的fortran代码:
subroutine matmultmkl(M1, M2, M3, M, N, K) bind(c, name='matmultmkl')
!DEC$ ATTRIBUTES DLLEXPORT :: matmultmkl
use iso_c_binding, only: c_float, c_int
integer(c_int),intent(in) :: M, N, K
real(c_float), intent(in) :: M1(M, N), M2(N, K)
real(c_float), intent(out):: M3(M, K)
CALL DGEMM('N','N',M,K,N,1.,M1,M,M2,N,0.,M3,M)
end subroutine
我使用以下批处理文件通过命令行(在我之前运行 compilervars.bat 的 cmd 窗口中)编译它:
@Echo off
setlocal ENABLEDELAYEDEXPANSION
SET "IFORT_INITIAL_FLAGS=-c -fpp"
SET "IFORT_OPTIMIZATION_FLAGS=/O3"
ifort %IFORT_OPTIMIZATION_FLAGS% %IFORT_INITIAL_FLAGS% /I"C:\Program Files (x86)\IntelSWTools\compilers_and_libraries_2020.4.311\windows\mkl\include" -o mkl_example.obj mkl_example.f
ifort -dll -o mylib.dll mkl_example.obj /link /LIBPATH:"C:\Program Files (x86)\IntelSWTools\compilers_and_libraries_2020.4.311\windows\mkl\lib\intel64_win" mkl_intel_lp64.lib mkl_intel_thread.lib mkl_core.lib libiomp5md.lib
然后我运行以下python脚本mkl_example.py:
from ctypes import *
import time
import os
os.add_dll_directory("C:/Program Files (x86)/IntelSWTools/compilers_and_libraries_2020.4.311/windows/mkl/lib/intel64_win")
os.add_dll_directory("C:/Program Files (x86)/IntelSWTools/compilers_and_libraries_2020.4.311/windows/compiler/lib/intel64_win")
import numpy as np
mylib = CDLL('./mylib.dll')
mylib.matmultmkl.argtypes = [ POINTER(c_float),
POINTER(c_float),
POINTER(c_float),
POINTER(c_int),
POINTER(c_int),
POINTER(c_int) ]
mylib.matmultmkl.restype = None
M=1000
N=1000
K=1000
a = np.empty((M,N), dtype=c_float)
b = np.empty((N,K), dtype=c_float)
c = np.empty((M,K), dtype=c_float)
a[:] = np.random.rand(M,N)
b[:] = np.random.rand(N,K)
# Fortran mkl call
start = time.time()
mylib.matmultmkl( a.ctypes.data_as(POINTER(c_float)),
b.ctypes.data_as(POINTER(c_float)),
c.ctypes.data_as(POINTER(c_float)),
c_int(M), c_int(N), c_int(K) )
stop = time.time()
print(f"Fortran mkl \t {stop - start}s")
输出是:
Traceback (most recent call last):
File "path\to\mkl_example.py", line 14, in <module>
mylib = CDLL('./mylib.dll')
File "C:\PYTHON\3\3.8.2_64bits\lib\ctypes\__init__.py", line 373, in __init__
self._handle = _dlopen(self._name, mode)
FileNotFoundError: path\to\mylib.dll' (or one of its dependencies). Try using
the full path with constructor syntax.
如果你删除所有 mkl 的东西并自己编写一个函数,mylib.dll 会在运行时由 python 找到。因此,在我链接到 mkl 的情况下,该消息并不意味着即使 mylib.dll 位于正确的位置,由于某些奇怪的原因在运行时找不到它,但确实找不到它的依赖项之一。
除了找到 all 依赖项并将它们放在 fortran dll 和 python 文件旁边的同一个文件夹中之外,我没有看到我能做什么。但如果这是唯一的方式,也许我更喜欢绝对退出。
【问题讨论】:
标签: python windows fortran ctypes intel