回 帖 发 新 帖 刷新版面

主题:新手请教intel fortran mkl 编译问题!

各位:
    我下了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个回复)

沙发

LIBARARY_PATH=$/opt/intel/mkl/10.0.5.025/lib/32/:/opt/intel/fc/10.1.015/lib/$

写法正确吗

板凳

环境变量我是请同学设置得,我刚用linux,图书馆这方面的书也找不到
请说得基础些,谢谢!

3 楼

跟编译器一样,mkl也自带设置环境变量的脚本。

是在mkl目录下的tools/environment/里面,
名为mklvars32.sh (32位) 或者  mklvarsem64t.sh (64位)。

在.bashrc中 source一下。

4 楼

.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 楼

97,98删掉,不要自己设置。而且96行已经source MKL的脚本设置了环境,又被你的97,98行覆盖掉了。

视自己cpu类型和linux是32位或者64位的,只要source mklvars32.sh或mklvarsem64t.sh其中的一个。

这个脚本中设置了MKL所需要的INCLUDE、LIBRARY_PATH和LD_LIBRARY_PATH环境变量,足以解决你的问题。

6 楼

已经删掉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 楼

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 楼

谢谢f2003的耐心解答,我现在又回到windows下编程,但还是继续讨论下。
手册74页中说fortran90的接口要用libmkl_lapack95.a等三个文件,要用make PLAT=lnx32 lib命令自己生成
source版本没错,没调mkl时能正常编译
我查看了$INCLUDE,LD_LIBRARY_PATH ,LIBRARY_PATH,指向无误

从报错信息中,我看不出是否需要新的库

另外,当时同学给我下了lapack3.2,能用,不过我就是觉得怎么这么搞不定mkl呢,所以一直纠缠于这个问题
再次谢谢你的帮助!



我来回复

您尚未登录,请登录后再回复。点此登录或注册