在Clojure中使用Neanderthal时遭遇Intel MKL库错误求助
解决Neanderthal库在Windows 10下rand-normal!和rand-uniform!的MKL错误(错误码-1140)
你遇到的MKL错误码-1140,大概率是本地MKL环境变量配置不完整,或者JVM没正确加载MKL依赖导致的——既然另一台电脑能正常运行,说明代码本身完全没问题,问题就出在本地的环境配置上。下面是一步步的排查和解决方法:
一、彻底检查并修复MKL环境变量
首先得确保MKL的环境变量能被JVM正确识别:
- 先确认你装的是64位Intel MKL(和Windows 10 64位匹配),并且安装路径里没有中文、空格这类特殊字符(如果有,建议卸载后重新装到纯英文路径下)。
- 重新执行
mklvars intel64.bat:
找到MKL安装目录里的这个脚本,路径通常是C:\Program Files (x86)\Intel\oneAPI\mkl\latest\env\mklvars.bat(如果是oneAPI版本),或者旧版的C:\Program Files\Intel\MKL\<版本号>\bin\mklvars intel64.bat。一定要用管理员身份打开命令提示符再执行这个脚本,执行完后输入set命令,检查有没有以下关键变量:MKLROOT:指向MKL的根目录PATH:包含MKL的intel64\bin目录INCLUDE:包含MKL的头文件目录LIB:包含MKL的库文件目录
- 如果脚本执行后变量没生效,手动添加系统环境变量:
- 右键「此电脑」→ 属性 → 高级系统设置 → 环境变量
- 在系统变量里新增:
- 变量名:
MKLROOT,变量值:你的MKL根目录(比如C:\Program Files (x86)\Intel\oneAPI\mkl\latest)
- 变量名:
- 编辑
PATH系统变量,添加:%MKLROOT%\intel64\bin- 如果你装的是oneAPI,还要加
C:\Program Files (x86)\Intel\oneAPI\compiler\latest\windows\bin\intel64
- 新增
INCLUDE系统变量:%MKLROOT%\include - 新增
LIB系统变量:%MKLROOT%\lib\intel64
- 配置完后必须重启所有终端和IDE,环境变量只有重启后才会生效。
二、调整JVM配置,确保加载MKL
你的project.clj用了JDK 12,而Neanderthal对长期支持版JDK(比如8或11)兼容性更好,建议先试试切换JDK版本:
- 修改
project.clj里的:java-cmd路径,换成JDK 8或11的java.exe路径,比如::java-cmd "C:/Program Files/Java/jdk1.8.0_301/bin/java" - 检查JVM的库路径是否包含MKL的bin目录:在REPL里执行这段代码:
如果输出里没有MKL的(System/getProperty "java.library.path")intel64\bin目录,就在project.clj的:jvm-opts里手动指定:
记得把路径换成你实际的MKL bin目录。:jvm-opts ["--add-opens=java.base/jdk.internal.ref=ALL-UNNAMED" "-Djava.library.path=C:/Program Files (x86)/Intel/oneAPI/mkl/latest/intel64/bin"]
三、固定依赖版本,避免兼容问题
不要用LATEST来指定依赖版本,这很容易引入兼容性问题,换成具体的稳定版:
修改project.clj的:dependencies部分:
:dependencies [[org.clojure/clojure "1.11.1"] [uncomplicate/neanderthal "0.42.0"] [incanter "1.9.3"] [org.clojure/tools.nrepl "0.2.13"] [nrepl "1.0.0"] [cider/cider-nrepl "0.30.0"]]
然后执行lein deps重新拉取依赖。
四、用最小化代码测试环境
写一个最简单的测试代码,排除其他代码的干扰:
(ns test-mkl (:require [uncomplicate.neanderthal.native :refer [fv]] [uncomplicate.neanderthal.random :refer [rand-uniform!]])) (def x (fv 5)) (rand-uniform! x) (println x)
在配置好环境变量的终端里运行lein run,如果能正常输出随机向量,说明环境已经配置好了。
如果以上步骤都试过还是不行,建议卸载当前的MKL,重新安装Intel oneAPI Base Toolkit(包含最新版MKL),安装时选默认路径,避免任何特殊字符,安装完成后再执行mklvars intel64.bat。
内容的提问来源于stack exchange,提问作者Vasco Ferreira
相关产品推荐
相关产品推荐

