主题:新手请教intel fortran mkl 编译问题!
ywzhong [专家分:100] 发布于 2008-12-11 21:17:00
各位:
我下了mkl,不能编译成功。
.bashrc文件增加了如下命令:
source /opt/intel/fc/10.1.015/bin/ifortvars.sh
source /opt/intel/idb/10.1.015/bin/idbvars.sh
LIBARARY_PATH=$/opt/intel/mkl/10.0.5.025/lib/32/:/opt/intel/fc/10.1.015/lib/$
export LIBARARY_PATH
按照手册,我运行了命令:make PLAT=lnx32 lib,在/opt/intel/mkl/10.0.5.025/lib/32下产生了libmkl_lapack95.a等三个文件。
把examples-lapack95里的gesv.f90拷贝到我的主目录下:/home/storm/program,然后运行:
ifort gesv.f90 -l/opt/intel/mkl/10.0.5.025/lib/32/libmkl_lapack95.a
结果是:
fortcom: Error: gesv.f90, line 31: Error in opening the compiled module file. Check INCLUDE paths. [MKL95_PRECISION]
USE MKL95_PRECISION, ONLY: WP => SP
----------^
fortcom: Error: gesv.f90, line 32: Error in opening the compiled module file. Check INCLUDE paths. [MKL95_LAPACK]
USE MKL95_LAPACK, ONLY: GESV
----------^
将libmkl_lapack95.a拷贝到/home/storm/program下,运行:ifort gesv.f90 libmkl_lapack95.a,结果是一样得
请高手们教我,谢谢!
回复列表 (共8个回复)
沙发
f2003 [专家分:7960] 发布于 2008-12-11 23:59:00
LIBARARY_PATH=$/opt/intel/mkl/10.0.5.025/lib/32/:/opt/intel/fc/10.1.015/lib/$
写法正确吗
板凳
ywzhong [专家分:100] 发布于 2008-12-12 13:02:00
环境变量我是请同学设置得,我刚用linux,图书馆这方面的书也找不到
请说得基础些,谢谢!
3 楼
f2003 [专家分:7960] 发布于 2008-12-12 16:39:00
跟编译器一样,mkl也自带设置环境变量的脚本。
是在mkl目录下的tools/environment/里面,
名为mklvars32.sh (32位) 或者 mklvarsem64t.sh (64位)。
在.bashrc中 source一下。
4 楼
ywzhong [专家分:100] 发布于 2008-12-12 20:11:00
.bashrc文件修改如下:
94 source /opt/intel/fc/10.1.015/bin/ifortvars.sh
95 source /opt/intel/idb/10.1.015/bin/idbvars.sh
96 source /opt/intel/mkl/10.0.5.025/tools/environment/mklvarsem64t.sh(或者mklvars32.sh)
97 LD_LIBARARY_PATH=$/opt/intel/mkl/10.0.5.025/lib/32/:/opt/intel/fc/10.1.015/lib/$
98 export LIBARARY_PATH
进入gesv.f90的目录,该目录中同时含有libmkl_lapack95.a
运行:ifort gesv.f90 libmkl_lapack95.a;
或者:ifort gesv.f90;
或者:ifort gesv.f90 -l/opt/intel/mkl/10.0.5.025/lib/32/libmkl_lapack95.a
得到的结果还是一样:
fortcom: Error: gesv.f90, line 31: Error in opening the compiled module file. Check INCLUDE paths. [MKL95_PRECISION]
USE MKL95_PRECISION, ONLY: WP => SP
----------^
fortcom: Error: gesv.f90, line 32: Error in opening the compiled module file. Check INCLUDE paths. [MKL95_LAPACK]
USE MKL95_LAPACK, ONLY: GESV
----------^
fortcom: Error: gesv.f90, line 39: A kind type parameter must be a compile-time constant. [WP]
REAL(WP), ALLOCATABLE :: A(:,:), AA(:,:), B(:,:), BB(:,:)
-----------^
fortcom: Error: gesv.f90, line 64: Conflicting attributes or multiple declaration of name. [GESV]
CALL GESV( A, B )
-----------^
fortcom: Error: gesv.f90, line 71: Conflicting attributes or multiple declaration of name. [GESV]
CALL GESV( AA, BB(:,1), IPIV, INFO )
-----------^
fortcom: Error: gesv.f90, line 31: Unresolved rename. [WP]
USE MKL95_PRECISION, ONLY: WP => SP
---------------------------------^
fortcom: Error: gesv.f90, line 32: Name in only-list does not exist. [GESV]
USE MKL95_LAPACK, ONLY: GESV
------------------------------^
compilation aborted for gesv.f90 (code 1)
5 楼
f2003 [专家分:7960] 发布于 2008-12-12 22:44:00
97,98删掉,不要自己设置。而且96行已经source MKL的脚本设置了环境,又被你的97,98行覆盖掉了。
视自己cpu类型和linux是32位或者64位的,只要source mklvars32.sh或mklvarsem64t.sh其中的一个。
这个脚本中设置了MKL所需要的INCLUDE、LIBRARY_PATH和LD_LIBRARY_PATH环境变量,足以解决你的问题。
6 楼
ywzhong [专家分:100] 发布于 2008-12-13 14:15:00
已经删掉97,98,还是没编译成功
我的shell是bash shell,用.sh应该是对得吧?
现在.bashrc的设置如下:
source /opt/intel/fc/10.1.015/bin/ifortvars.sh
source /opt/intel/idb/10.1.015/bin/idbvars.sh
source /opt/intel/mkl/10.0.5.025/tools/environment/mklvars32.sh
也试过mklvars64.sh,mklvarsem64t.sh,结果是一样得
运行:
ifort gesv.f90 -l/opt/intel/mkl/10.0.5.025/lib/32/libmkl_lapack95.a
或者:
ifort gesv.f90
或者:
ifort gesv.f90 libmkl_lapack95.a
得到的结果都是:
fortcom: Error: gesv.f90, line 31: Error in opening the compiled module file. Check INCLUDE paths. [MKL95_PRECISION]
USE MKL95_PRECISION, ONLY: WP => SP
----------^
fortcom: Error: gesv.f90, line 32: Error in opening the compiled module file. Check INCLUDE paths. [MKL95_LAPACK]
USE MKL95_LAPACK, ONLY: GESV
----------^
fortcom: Error: gesv.f90, line 39: A kind type parameter must be a compile-time constant. [WP]
REAL(WP), ALLOCATABLE :: A(:,:), AA(:,:), B(:,:), BB(:,:)
-----------^
fortcom: Error: gesv.f90, line 64: Conflicting attributes or multiple declaration of name. [GESV]
CALL GESV( A, B )
-----------^
fortcom: Error: gesv.f90, line 71: Conflicting attributes or multiple declaration of name. [GESV]
CALL GESV( AA, BB(:,1), IPIV, INFO )
-----------^
fortcom: Error: gesv.f90, line 31: Unresolved rename. [WP]
USE MKL95_PRECISION, ONLY: WP => SP
---------------------------------^
fortcom: Error: gesv.f90, line 32: Name in only-list does not exist. [GESV]
USE MKL95_LAPACK, ONLY: GESV
------------------------------^
compilation aborted for gesv.f90 (code 1)
7 楼
f2003 [专家分:7960] 发布于 2008-12-13 15:42:00
1)关于调用mkl库:
ifort gesv.f90 -lmkl_lapack95才是-l命令行参数的正确写法,也就是要把前缀lib和后缀.a都去掉。gfortran,ifort都是这么规定的。
mkl是所谓模块化库,库文件之间分层次,彼此调用。所以只-lmkl_lapack95大概还不够,因为libmkl_lapack95本身对底层其他库有依赖。所以还需要另外几个-l,编译器报告缺什么你就补什么。我记得mkl的文档中其实都有写出来了。
还有我觉得很奇怪,我的mkl目录下只有libmkl_lapack.a,没有你所谓libmkl_lapack95.a。虽然libmkl_lapack.a文件名没有95两个字母,其实也是带f90接口的。
mkl下面的文档你一定要看,不然我要说到明天天亮。
2)关于.mod模块的包含。
你的编译器报告不能打开.mod文件,要求检查INCLUDE环境变量,这是因为INCLUDE环境变量负责设置.mod文件的路径。
INCLUDE是在编译器和mkl库的脚本文件中被设置,你已经source这些脚本了。你全部需要做的只是确认source的是否正确的脚本。
用uname -a看看你的机器是32位还是64位。
用echo $INCLUDE 察看INCLUDE环境的内容,检查是否正确。
LD_LIBRARY_PATH LIBRARY_PATH环境变量也要看看。
另外,修改了.bashrc后,要重新登录或者重新打开一个新终端程序才能起作用。
总之多看帮助多动手尝试,翻来覆去就这么点“玄机”。
8 楼
ywzhong [专家分:100] 发布于 2008-12-13 17:22:00
谢谢f2003的耐心解答,我现在又回到windows下编程,但还是继续讨论下。
手册74页中说fortran90的接口要用libmkl_lapack95.a等三个文件,要用make PLAT=lnx32 lib命令自己生成
source版本没错,没调mkl时能正常编译
我查看了$INCLUDE,LD_LIBRARY_PATH ,LIBRARY_PATH,指向无误
从报错信息中,我看不出是否需要新的库
另外,当时同学给我下了lapack3.2,能用,不过我就是觉得怎么这么搞不定mkl呢,所以一直纠缠于这个问题
再次谢谢你的帮助!
我来回复