Как прокомментировал Митч, для этого есть скалярная функция: 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.