Fortran Coder

楼主: FLY
打印 上一主题 下一主题

[数学库] 调用MKL函数无法解析

[复制链接]

31

帖子

5

主题

0

精华

入门

F 币
105 元
贡献
54 点
跳转到指定楼层
楼主
发表于 2014-7-22 20:20:55 | 显示全部楼层 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 FLY 于 2014-7-23 09:50 编辑

      各位大大,小白又来了。我在调用MKL函数时,可以调用sgemm[求单精度实数矩阵的乘积,fortran77接口],但是调用gemm[任何数据类型的矩阵乘积,fortran95接口,设置的参数少]编译时则提醒无法解析。求指导。
      按照9L大大的指导能运行,但是举一反三的时候又错了,怎么办?求助。    具体的错误细节在12楼
分享到:  微信微信
收藏收藏1 点赞点赞 点踩点踩

31

帖子

5

主题

0

精华

入门

F 币
105 元
贡献
54 点
沙发
 楼主| 发表于 2014-7-22 22:31:44 | 显示全部楼层
珊瑚虫 发表于 2014-7-22 21:51
检查一下函数名称是不是写错了,此外,相应的库有没有配置好

怎么配置相应的库文件啊,我是用的最新的IVF编译器,所以在项目—属性—Fortran-library-Use Intel Math Library设置的。还需要其他的设置么?

31

帖子

5

主题

0

精华

入门

F 币
105 元
贡献
54 点
板凳
 楼主| 发表于 2014-7-23 00:13:16 | 显示全部楼层
珊瑚虫 发表于 2014-7-22 22:41
请参考
http://fcode.cn/guide-58-1.html

还是不行啊,亲。错误如下:
error #6404: This name does not have a type, and must have an explicit type.   [DOT]
    dot函数在MKL手册中第59页,fortran95接口,还有两个同样功能的函数sdot和ddot,可以使用,但是是fortran77接口。

31

帖子

5

主题

0

精华

入门

F 币
105 元
贡献
54 点
地板
 楼主| 发表于 2014-7-23 06:48:09 | 显示全部楼层
vvt 发表于 2014-7-23 06:40
代码发出来看看吧。应该是没有 use 模块。

编译错误,要么是没有 use,要么是没有设置好 include。

不是直接就能用么,需要USE模块。
[Fortran] 纯文本查看 复制代码
Subroutine Test_sdot!矢量点乘
    implicit none
    real x(10), y(10), sdot, res
    integer n, incx, incy, i
    external dot
    n = 5
    incx = 2
    incy = 1
    do i = 1, 10
       x(i) = 1
       y(i) = 1
    end do
    res = sdot (n, x, incx, y, incy)
    print*,"SDOT=",res 
    res=dot(x,y)
    write(*,*) res
End subroutine

31

帖子

5

主题

0

精华

入门

F 币
105 元
贡献
54 点
5#
 楼主| 发表于 2014-7-23 06:49:54 | 显示全部楼层
不知道是不是需要激活的原因

捕获.PNG (80.14 KB, 下载次数: 503)

捕获.PNG

31

帖子

5

主题

0

精华

入门

F 币
105 元
贡献
54 点
6#
 楼主| 发表于 2014-7-23 07:23:52 | 显示全部楼层
vvt 发表于 2014-7-23 06:59
[mw_shl_code=fortran,true]Program www_fcode_cn
  call Test_sdot()
End Program www_fcode_cn

按照你的指导,已经可以运行了。现在有几个问题想继续请教一下:
1、之前帖子http://fcode.cn/guide-58-1.html中说只需要在:项目-属性-Fortran-Libraries,选择 Use Intel math Kernel Library设置即可,为什么还需要设置:项目—属性—Linker-Input-Additional Dependencies 输入 mkl_blas95.lib
2、是通过何种方式知道要加载mkl_blas95.lib这个库文件,也就是说当实现不同功能时如何去获取其他库文件的名字。
3、use BLAS95这个类的名字是如何获取的,那个文档我看的不仔细,没找到啊。比如说我想求逆阵和复数矩阵的所有特征值、特征向量该加载哪一个呢?
4、当用了use BLAS95模块之后,之前的fortran77的sdot函数将不能在同一个过程中继续使用,这是为何?有没有什么办法可以继续使用,如果需要的话。
5、最后程序编译完成时是DLL,我在转移生成的DLL时需要打包使用的库文件么?如果生成EXE文件,是否同样需要。
      谢谢啦

31

帖子

5

主题

0

精华

入门

F 币
105 元
贡献
54 点
7#
 楼主| 发表于 2014-7-23 09:47:05 | 显示全部楼层
vvt 发表于 2014-7-23 07:33
1.那篇帖子是针对各种函数库进行的,是说的使用所有函数库的“通则”,不可能说得很详细。
2.帮助里提到:
...

按照你说的,在加载其他文件的时候我还是遇到一些问题。
比如我想利用fortran95接口求矩阵的逆阵:
    首先需要将矩阵LU分解,分解函数为getrf(fortran95接口,Page420),求逆阵函数getri,两个函数版主文件相同。帮助里提到:
Include Files
• Fortran: mkl.fi
• Fortran 95: lapack.f90
• C: mkl.h

我在项目—属性—Linker-Input-Additional Dependencies 输入  mkl_lapack95.lib
完整代码如下:
[Fortran] 纯文本查看 复制代码
Program Main
   call  Test_getrf
   call  Test_dot
End program
 Subroutine Test_dot!矢量点乘
    use BlAS95
    implicit none
    real x(10), y(10),res
    integer::i 
    do i = 1, 10
       x(i) = 1
       y(i) = 1
    end do
    res=5
    res=dot(x,y)
    write(*,*) res
End subroutine
    
Subroutine Test_getrf!矩阵分解成LU,并求逆阵
   use LAPACK95
   implicit none
   real(kind=4)::a(3,3)=(/1,1,3,2,1,-1,-1,2,1/)
   integer::ipiv=3,info=0,work(1)=3
   write(*,*) a(1,:)
   write(*,*) a(2,:)
   write(*,*) a(3,:)
   call getrf(a,ipiv,info)!矩阵分解成LU
   call getri(a,ipiv,info)!求逆阵
   write(*,*) info
   write(*,*) a(1,:)
   write(*,*) a(2,:)
   write(*,*) a(3,:)
End subroutine  

编译之后错误如下:
错误        3         error #5508: Declaration of routine 'TEST_DOT' conflicts with a previous declaration       
错误        1         error #6285: There is no matching specific subroutine for this generic subroutine call.   [GETRF]       
错误        2         error #6285: There is no matching specific subroutine for this generic subroutine call.   [GETRI]       
错误        4        Compilation Aborted (code 1)

本来能运行的dot函数也不能运行了。
怎么办啊。。。

31

帖子

5

主题

0

精华

入门

F 币
105 元
贡献
54 点
8#
 楼主| 发表于 2014-7-23 10:47:40 | 显示全部楼层
vvt 发表于 2014-7-23 10:20
两个问题:
1.如果你既使用了 mkl_blas95.lib,又使用了 mkl_lapack95.lib,请在项目—属性—Linker-Input- ...

找到问题了,是第二个。但是我又有疑问了:
1、为什么在Fortran77接口中,ipiv可以使一个整数,而不是数组依然可以运行,并计算出来。
2、 getrf(fortran95接口),里面的三个参数是不是只有第一个是必须的,其他两个是可选的。如果是,怎么才能只输入a,不输入ipiv和info;怎么才能只输入a和info,不输入ipiv。
3、在MKL的include中有两个文件夹:ilp64、lp64 。但是里面的Mod文件是一样的,请问这个64位的模块有什么不一样吗?
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-5-14 07:23

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表