Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran 如何正确使用来自mkl的mkl_domatcopy?_Fortran_Intel Mkl - Fatal编程技术网

Fortran 如何正确使用来自mkl的mkl_domatcopy?

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

我需要找到一种使用MKL转换矩阵的更快方法。我试过mkl公司的mkl_domatcopy,但一直都没做对

以下是测试代码(Fortran):

输出为:

   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