如何从MKL正确使用mkl_domatcopy?

时间:2016-08-29 09:08:56

标签: fortran intel-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'的含义。

2 个答案:

答案 0 :(得分:1)

正如用户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_domatcopy(“c”,“t”,3,3,9,M,3,MT,3)   ----------------------------------------------- ^编译中止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

然后您的应用程序返回

$ ./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 此参数按字母缩放输入矩阵。

并注意输出是转置的,每个元素乘以9。

答案 1 :(得分:0)

在fortran90中进行转置的最快方法如下

B = TRANSPOSE(A)

做MATMUL的最快方法是:

C = MATMUL(A,B)

因为它是语言中固有的,我不确定MKL / IMKL在哪里发挥作用?