Как правильно использовать mkl_domatcopy от MKL?

Мне нужно найти более быстрый способ транспонирования матрицы с использованием MKL. И я попробовал mkl_domatcopy из MKL, но так и не понял.

Вот тестовый код (Фортран):

        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: я до сих пор не понимаю, что означает "альфа".

2 ответа

Решение

Как пользователь 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) -----------------------------------------------^ сборка прервана для 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 значит, руководство говорит

альфа Этот параметр масштабирует входную матрицу по альфа.

и обратите внимание, что выходные данные транспонированы, а каждый элемент умножен на 9.

Самый быстрый способ сделать транспонирование в fortran90 заключается в следующем

B = TRANSPOSE(A)

И самый быстрый способ сделать MATMUL это:

C = MATMUL(A,B)

Поскольку это присуще языку, я не уверен, где MKL/IMKL вступает в игру?

Другие вопросы по тегам