如何正确使用 MKL 中的 mkl_domatcopy?
How to correctly use mkl_domatcopy from MKL?
我需要找到一种使用 MKL 转置矩阵的更快方法。我尝试了 MKL 的 mkl_domatcopy,但从来没有做对。
这里是测试代码(Fortran):
PROGRAM MAIN
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
输出为:
1.00000000000000 2.00000000000000 3.00000000000000
1.00000000000000 2.00000000000000 3.00000000000000
1.00000000000000 2.00000000000000 3.00000000000000
************************
0
为什么MT是0?是我用错了还是什么?
关于此函数的文档:
https://software.intel.com/en-us/node/520863
PS:我还是不明白'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): error #6633: The type of the actual argument differs
from the type of the dummy argument. [9]
call mkl_domatcopy("c","t",3,3,9,M,3,MT,3)
-----------------------------------------------^ compilation aborted for test.f90 (code 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
然后你的申请returns
$ ./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
的意思,manual 说
alpha This parameter scales the input matrix by alpha.
并注意输出是转置后的每个元素乘以 9。
我需要找到一种使用 MKL 转置矩阵的更快方法。我尝试了 MKL 的 mkl_domatcopy,但从来没有做对。
这里是测试代码(Fortran):
PROGRAM MAIN
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
输出为:
1.00000000000000 2.00000000000000 3.00000000000000
1.00000000000000 2.00000000000000 3.00000000000000
1.00000000000000 2.00000000000000 3.00000000000000
************************
0
为什么MT是0?是我用错了还是什么?
关于此函数的文档: https://software.intel.com/en-us/node/520863
PS:我还是不明白'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): error #6633: The type of the actual argument differs from the type of the dummy argument. [9] call mkl_domatcopy("c","t",3,3,9,M,3,MT,3) -----------------------------------------------^ compilation aborted for test.f90 (code 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
然后你的申请returns
$ ./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
的意思,manual 说
alpha This parameter scales the input matrix by alpha.
并注意输出是转置后的每个元素乘以 9。