如何正确使用 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。