Как правильно использовать 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 вступает в игру?