Как получить сопряжение матрицы nxn в Фортране 90? - PullRequest
1 голос
/ 15 марта 2019

У меня сложная матрица, заданная следующим образом:

complex(rdp) :: a(:,:)

Предположим, эта матрица равна nxn.Как я могу связать каждую запись матрицы?Есть ли для этого встроенная функция?

Ответы [ 2 ]

1 голос
/ 15 марта 2019

Стандарт Fortran имеет CONJG свойственную.Удобно, что это elemental свойственно, что означает, что если вы передадите ему аргумент массива, а не скаляр, он будет работать с каждым элементом массива.Например,

program conjgtest
  use iso_fortran_env, only: real64
  implicit none
  real(real64) :: r(2, 4)
  complex(real64) :: c(2,2)
  call random_number(r)
  c = cmplx(r(:, 1:2), r(:, 3:4), real64)
  print *, c
  print *, "conjugate:"
  print *, conjg(c)
end program conjgtest
0 голосов
/ 15 марта 2019

Как прокомментировал Митч, для этого есть скалярная функция: https://gcc.gnu.org/onlinedocs/gfortran/CONJG.html

Компилятор должен иметь возможность легко векторизовать это в массиве;это просто XOR знак мнимой части.Вам не нужно встроенное, чтобы воспользоваться SIMD 1 .

В любом случае, делать это на лету будет очень дешево;вероятно, плохая идея сделать отдельный цикл над массивом (или 2D-матрицей) просто для применения этой операции , если только вы не собираетесь перечитывать этот массив много раз.Увеличьте свою вычислительную интенсивность (операции ALU на загрузку / хранение ваших данных или на перенос их в кэш), сложив конъюгацию во все, что вы делаете дальше.

Или кешируйте блокирующую матрицу и сопрягайте ее частьперед передачей этого фрагмента в следующую операцию.


Сноска 1: Хотя для сложного real8 SIMD будет полезен только с векторной шириной, превышающей 128-битный = 16 байт = размер одного сложного real8,Если это все, что у вас есть, вы можете просто использовать скалярный xor.Если результат не используется ни для чего другого, компилятор x86 может просто использовать xor dword [rdi+12], 1<<31 с указателем на сложный real8 в RDI.Но с AVX или более широким, вы можете сделать 256-битный vxorps, который переворачивает старший бит в двух сложных real8s одновременно.Или аналогично с ARM SVE.

...