【问题标题】:How to use Intel fortran compiler with MKL on command line如何在命令行上使用带有 MKL 的 Intel fortran 编译器
【发布时间】:2022-01-28 08:23:44
【问题描述】:

我为 Fortran OS X*(学生版)全新安装了英特尔® Parallel Studio XE Composer 版。它带有数学内核库,这就是我购买它的原因。我很难开始使用 MKL。这是我一步一步完成的。

1) 为 Fortran OS X* 安装了英特尔® Parallel Studio XE Composer 版(没问题)。我可以使用ifort 运行“hello world”脚本,并在最后毫无问题地抛出-mkl 链接命令(目前还没有调用任何mkl 命令)。

2) 在these instructions 之后,我使用 intel 提供的脚本(准确地说,位于 opt/intel/bin 中)设置了我的环境变量。我有英特尔 64 位架构(根据ifort -V),所以我使用bash mklvars.sh intel64 mod ilp64。它运行没有错误(或任何输出)。

3) 我编写了以下代码来使用 MKL 的 gemm fortran95 命令。只需乘以 2 个矩阵。

program test

implicit none
real, dimension(2,2) :: testA, testB, testC

testA = 1
testB = 1
testC = 0  ! I don't think I need this line, but it shouldn't matter

call gemm(testA, testB, testC)

write(*,*) testC

end program test

4) 我用ifort test_mkl.f90 -o test -mkl 编译。我收到以下错误:

Undefined symbols for architecture x86_64:
  "_gemm_", referenced from:
      _MAIN__ in ifortSTVOrB.o
ld: symbol(s) not found for architecture x86_64

5) 我尝试ifort test_mkl.f90 -o test -L/opt/intel/mkl/lib -mkl 并得到相同的结果。

我注意到很多使用 MKL 的人的代码都以 USE mkl95_blas, ONLY: gemm 开头,所以我在上面的两个示例中都将其放在 implicit none 上面并得到:

    test_mkl.f90(4): error #7002: Error in opening the compiled module file.  Check INCLUDE paths.   [MKL95_BLAS]
    USE mkl95_blas, ONLY: gemm
--------^
test_mkl.f90(12): error #6406: Conflicting attributes or multiple declaration of name.   [GEMM]
    call gemm(testA, testB, testC )
---------^
test_mkl.f90(4): error #6580: Name in only-list does not exist.   [GEMM]
    USE mkl95_blas, ONLY: gemm
--------------------------^
compilation aborted for test_mkl.f90 (code 1)

关于问题是什么或如何解决这个问题的任何想法?我已经成功使用 MKL run a simple script in XCODE,所以这绝对是我正在做的事情,而不是我的安装。

【问题讨论】:

  • 看看能不能找到那个模块的路径...
  • 您必须为 rigjt 包含路径设置环境。这是您应该在英特尔支持论坛上提出的典型问题,您需要为支持付费。
  • 感谢 Vladimir,在看到您的评论后,我尝试了 MKL 的英特尔支持论坛并在那里找到了一些帮助。

标签: xcode command-line fortran intel-fortran intel-mkl


【解决方案1】:

文档告诉您在提供的 compilervars.sh 脚本上使用“source”命令来使所有资源可用。例如:

source //bin/compilervars.sh

这会将 MKL 添加到包含和库路径中,以便编译器和链接器可以找到它们。如果您需要更多帮助,请在https://software.intel.com/en-us/forums/intel-fortran-compiler-for-linux-and-mac-os-x 中询问您可以在https://software.intel.com/en-us/forums/intel-math-kernel-library 中获得 MKL 特定的帮助

【讨论】:

  • 另外,OS X 中的 .mod 文件的命名显然与其他地方不同。我将“use”语句更改为:USE blas95,它反映了我的 .mod 文件的名称。那个改变+你对 source 命令的建议起到了作用。 (具体看this link)。
  • 不,发生的事情是 MKL 在较新的 MKL 版本中更改了模块的名称。有关详细信息,请参阅 MKL 发行说明。
  • 这在 Windows 下似乎不起作用:在 cmd 窗口中运行 compilervas.bat 并编译规范 test_dgemm.f90 后会产生“错误 LNK2019:函数 MAIN__ 中引用的未解析的外部符号 DGEMM”错误.
  • 您需要命名您想要使用的 MKL 库或库 - 它不会自动完成。如果你添加-mkl选项,ifort驱动会添加一些常用的MKL库,你可以试试。否则,使用 MKL Link Line Advisor (software.intel.com/content/www/us/en/develop/tools/oneapi/…) 选择要使用的集合。
【解决方案2】:

我认为你的程序有一些bug,首先,你必须在代码的开头包含blas95,然后,你不能使用gemm,你必须选择gemm的具体版本。例如,做实数矩阵乘法,你必须使用dgemm,这是我的代码(我叫test.f90),使用ifort -mkl test.f90 -o test.exe编译成功

program test
    use blas95
    implicit none
    real*8,dimension(2,2)::testA,testB,testC
    integer::i,j
    testA=1d0
    testB=1d0
    testC=1d0
    call dgemm("N", "N", 2, 2, 2, 1d0, A, 2, B, 2, 0, C, 2)
    print *, testC
end program test

【讨论】:

  • 我同意问题中的代码不正确。但是一个人应该只做其中一种选择。要么使用旧接口并选择 sgemm 或 dgemm,要么使用 blas95 模块,然后可以使用 gemm 通用(具有更简单的接口)。当然,一个程序同时做这件事并没有错,但是模块没有用处。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-27
  • 2016-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-04
相关资源
最近更新 更多