【问题标题】:How to use BLAS functions in Fortran mex files如何在 Fortran mex 文件中使用 BLAS 函数
【发布时间】:2017-04-15 16:59:57
【问题描述】:

我尝试在我的 Fortran mex 文件中使用 BLAS 函数,但没有成功。这是我使用 DGEMM 的代码之一的示例:

#include "fintrf.h"

C     Gateway subroutine
  subroutine mexfunction(nlhs, plhs, nrhs, prhs)

C     Declarations
  implicit none

C     mexFunction arguments:
  mwPointer plhs(*), prhs(*)
  integer nlhs, nrhs

C     Function declarations:
  mwPointer mxGetPr
  mwPointer mxCreateDoubleMatrix
  mwsize    mxGetM,mxGetN

C     Pointers to input/output mxArrays:
  mwPointer pr_A, pr_B, pr_C
  mwSize :: sizea,sizeb

C     Array information:

  real*8, allocatable :: A(:,:),B(:,:),C(:,:)

C     Get the size of the input array.
  sizea = mxGetM(prhs(1))
  sizeb = mxGetN(prhs(2))

  allocate(A(sizea,sizea),B(sizea,sizeb),C(sizea,sizeb))

C     Create Fortran array from the input argument.
  pr_A = mxGetPr(prhs(1))
  pr_B = mxGetPr(prhs(2))

  call mxCopyPtrToReal8( pr_A, A, sizea**2 )
  call mxCopyPtrToReal8( pr_B, B, sizea*sizeb )

  call MUL(A,B,C,sizea,sizeb)

C     Create matrix for the return argument.
  plhs(1) = mxCreateDoubleMatrix(sizea, sizeb, 0)

  pr_C = mxGetPr(plhs(1))

  call mxCopyReal8ToPtr(C , pr_C, sizea*sizeb )

  return
  end

  subroutine MUL(A,B,C,sizea,sizeb)

  implicit none

  mwSize :: sizea,sizeb
  real*8 :: A(sizea,sizea),B(sizea,sizeb),C(sizea,sizeb),alpha,beta
  integer*4 :: M,N,K
  character ch1, ch2

  ch1 = 'N'
  ch2 = 'N'
  M=size(A,1)
  N=size(B,2)
  K=size(A,2)
  Alpha=1.
  Beta=0.

  CALL DGEMM(ch1,ch2,M,N,K,ALPHA,A,M,B,K,BETA,C,M)


  return
  end subroutine MUL

我使用以下行来创建一个 mex 文件:

mex -lmwblas Test.F

mex 文件构建时没有任何错误,但是当我尝试使用该函数时,matlab 关闭时没有任何错误消息。我将 Matlab R2016a 与 Intel Visual Fortran Composer XE 2013Microsoft Visual Studio 2012 一起使用。

【问题讨论】:

  • 如果注释掉 DGEMM 调用,它运行时不会崩溃吗?
  • @Vladimir F 它运行并返回零向量

标签: matlab fortran mex blas


【解决方案1】:

您没有正确调用 DGEMM。你所有的论点都是real*8,但其中许多应该是integers。

彻底检查 DGEMM 的文档,并在参数后检查您的调用参数以完全遵循接口。我非常确信为K 传递1 而不是sizea 的值也是错误的。但实际上,您必须检查每一个参数。

我建议在纯 Fortran 中测试您的子例程,并且只有在它们正常工作后才能从 Matlab 中使用它们。

【讨论】:

  • 我说过要彻底逐个检查文档。您是这么快就这样做了,还是您只是将real*8 更改为integer 并认为就足够了?当然是不够的!展示你自己的一些努力。
  • 并在纯 Fortran 中测试调用。启用编译器具有的所有错误检查功能。
  • 我已经彻底阅读了文档,并在发布问题之前检查了许多定义函数的方法,我忘记将变量类型更改为整数,该函数在纯 fortran 中工作正常并且没有错误
  • 那么,您是否真的注意到我在回答中添加了一些内容?这是对还是错?
  • 这不是我第一次使用 mex 文件,我所有的代码都是用纯 fortran 编写的,然后被转换为 mex 文件,在互联网上进行了长时间的搜索并一无所获,我已经问过这个问题了
【解决方案2】:

解决方案如下:

#include "fintrf.h"

C     Gateway subroutine
  subroutine mexfunction(nlhs, plhs, nrhs, prhs)

C     Declarations
  implicit none

C     mexFunction arguments:
  mwPointer plhs(*), prhs(*)
  integer nlhs, nrhs

C     Function declarations:
  mwPointer mxGetPr
  mwPointer mxCreateDoubleMatrix
  mwsize    mxGetM,mxGetN

C     Pointers to input/output mxArrays:
  mwPointer pr_A, pr_B, pr_C
  mwSignedIndex :: sizea,sizeb

C     Array information:

  real*8, allocatable :: A(:,:),B(:,:),C(:,:)

C     Get the size of the input array.
  sizea = mxGetM(prhs(1))
  sizeb = mxGetN(prhs(2))

  allocate(A(sizea,sizea),B(sizea,sizeb),C(sizea,sizeb))

C     Create Fortran array from the input argument.
  pr_A = mxGetPr(prhs(1))
  pr_B = mxGetPr(prhs(2))

  call mxCopyPtrToReal8( pr_A, A, sizea**2 )
  call mxCopyPtrToReal8( pr_B, B, sizea*sizeb )

  call MUL(A,B,C,sizea,sizeb)

C     Create matrix for the return argument.
  plhs(1) = mxCreateDoubleMatrix(sizea, sizeb, 0)

  pr_C = mxGetPr(plhs(1))

  call mxCopyReal8ToPtr(C , pr_C, sizea*sizeb )

  return
  end

  subroutine MUL(A,B,C,sizea,sizeb)

  implicit none

  mwSignedIndex :: sizea,sizeb
  real*8 :: A(sizea,sizea),B(sizea,sizeb),C(sizea,sizeb),alpha,beta
  mwSignedIndex :: M,N,K
  character ch1, ch2

  ch1 = 'N'
  ch2 = 'N'
  M=size(A,1)
  N=size(B,2)
  K=size(A,2)
  Alpha=1.0
  Beta=0.0
  CALL DGEMM(ch1,ch2,M,N,K,ALPHA,A,M,B,K,BETA,C,M)


  return
  end subroutine MUL

并构建 mex 文件使用

mex -largeArrayDims -lmwblas Test.F

【讨论】:

  • 如果您希望这对其他人有用,至少应该说一下您做了哪些更改以及问题出在哪里。
猜你喜欢
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
相关资源
最近更新 更多