Fortran 如何正确使用来自mkl的mkl_domatcopy?
我需要找到一种使用MKL转换矩阵的更快方法。我试过mkl公司的mkl_domatcopy,但一直都没做对 以下是测试代码(Fortran): 输出为:Fortran 如何正确使用来自mkl的mkl_domatcopy?,fortran,intel-mkl,Fortran,Intel Mkl,我需要找到一种使用MKL转换矩阵的更快方法。我试过mkl公司的mkl_domatcopy,但一直都没做对 以下是测试代码(Fortran): 输出为: 1.00000000000000 2.00000000000000 3.00000000000000 1.00000000000000 2.00000000000000 3.00000000000000 1.00000000000000 2.000000000
1.00000000000000 2.00000000000000 3.00000000000000
1.00000000000000 2.00000000000000 3.00000000000000
1.00000000000000 2.00000000000000 3.00000000000000
************************
0
为什么MT是0?是因为我用错了还是什么
有关此功能的文档:
注:我仍然不明白“alpha”是什么意思。在fortran90中进行转置的最快方法如下
B = TRANSPOSE(A)
进行MATMUL的最快方法是:
C = MATMUL(A,B)
由于它是语言中固有的,我不确定MKL/IMKL在哪里发挥作用?正如用户roygvib在评论中建议的那样,通过包含
MKL.fi
文件,您将获得更多详细信息
此代码
PROGRAM MAIN
INCLUDE 'mkl.fi'
INTEGER, PARAMETER:: NROW = 3 !rows
INTEGER, PARAMETER:: NCOL = 3 !cols
REAL*8, ALLOCATABLE:: M(:,:)
REAL*8, ALLOCATABLE:: MT(:,:)
INTEGER:: i,j
ALLOCATE(M(NROW,NCOL))
ALLOCATE(MT(NROW,NCOL))
DO i = 1, NROW
DO j = 1, NCOL
M(i,j)=i
END DO
END DO
call mkl_domatcopy("c","t",3,3,9,M,3,MT,3)
print *,M
print *,"************************"
print *,MT
END
引发以下错误
test.f90(23):错误#6633:实际参数的类型不同
从伪参数的类型。[9]
调用mkl_域复制(“c”,“t”,3,3,9,M,3,MT,3)
-----------------------------------------------^test.f90的编译已中止(代码1)
有趣的是,如果将9
转换为双精度值(或变量)——请注意,这里我只是将d0
后缀附加到浮点值
PROGRAM MAIN
INCLUDE 'mkl.fi'
INTEGER, PARAMETER:: NROW = 3 !rows
INTEGER, PARAMETER:: NCOL = 3 !cols
REAL*8, ALLOCATABLE:: M(:,:)
REAL*8, ALLOCATABLE:: MT(:,:)
INTEGER:: i,j
ALLOCATE(M(NROW,NCOL))
ALLOCATE(MT(NROW,NCOL))
DO i = 1, NROW
DO j = 1, NCOL
M(i,j)=i
END DO
END DO
call mkl_domatcopy("c","t",3,3,9d0,M,3,MT,3)
print *,M
print *,"************************"
print *,MT
END
然后您的应用程序返回
$ ./test
1.00000000000000 2.00000000000000 3.00000000000000
1.00000000000000 2.00000000000000 3.00000000000000
1.00000000000000 2.00000000000000 3.00000000000000
************************
9.00000000000000 9.00000000000000 9.00000000000000
18.0000000000000 18.0000000000000 18.0000000000000
27.0000000000000 27.0000000000000 27.0000000000000
最后,关于alpha
的含义
alpha此参数按alpha缩放输入矩阵
请注意,输出是转换,每个元素乘以9。是固定格式或自由格式的代码。如果固定格式的代码在什么位置,“调用”开始看起来像位置1,至少移动到位置6。假设(如上面的注释中所示)这确实是一个子程序调用而不是注释,您是否有一些方法(模块、包含文件等)来指定(显式)子程序的接口?它是固定格式的代码。很抱歉,我没有得到“位置1”。这是否意味着我应该将“调用”移到底部?缩进
call
行,使c
位于(至少)第7列,但保持该行在同一位置。与代码的其他部分对齐会很好。手册(Fortran版本)在这里,请尝试在程序语句下方插入include“mkl.fi”
或include“mkl_trans.fi”
,这可能会提供有用的消息。谢谢。看到您的示例后,我立即知道该函数是如何工作的。我已经测试了用户roygvib的建议,它确实起了作用。
$ ./test
1.00000000000000 2.00000000000000 3.00000000000000
1.00000000000000 2.00000000000000 3.00000000000000
1.00000000000000 2.00000000000000 3.00000000000000
************************
9.00000000000000 9.00000000000000 9.00000000000000
18.0000000000000 18.0000000000000 18.0000000000000
27.0000000000000 27.0000000000000 27.0000000000000