如何在命令行上使用带有 MKL 的英特尔 fortran 编译器

How to use Intel fortran compiler with MKL on command line

我刚刚安装了英特尔® Parallel Studio XE Composer Edition for Fortran OS X*(学生版)。它带有 Math Kernel Library,这就是我购买它的原因。我很难开始使用 MKL。这是我一步一步完成的。

1) 为 Fortran OS X* 安装了英特尔® Parallel Studio XE Composer Edition(没问题)。我可以使用 ifort 运行 一个 'hello world' 脚本并在最后抛出 -mkl link 命令没有问题(目前还没有调用任何 mkl 命令) .

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

3) 我编写了以下代码来使用 MKL 的 fortran95 gemm 命令。只需乘以 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)

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

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

来源//bin/compilervars.sh

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

中询问

我认为你的程序有一些错误,首先,你必须在代码的开头包含 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