Т.е. я правильно понимаю, что simd это не про выполнение на нескольких ядрах процессора(с параллелизмом по данным итд), а про использование векторных операций?
@simd не дает значимого эффекта, к сожалению. Даже с вариантом, когда потоковая схема "захардкожена" внутрь цикла. Там в функции плохие операторы стоят, типа sign
Насколько я понимаю, @simd (как операция) появился в языке достаточно давно, @avx это что-то более новое и экспериментальное (и вообще разрабатывается не core командой). Насколько я знаю, @avx более сложно устроен и использует более широкий набор операций, но за счёт этого у него похуже покрытие.
Спасибо. У ifort есть ключики -xSSE, -xAVX, -xAVX512. Судя по ассемблеру, последние 2 включают автовекторизацию циклов с использованием продвинутых векторных регистров и комманд. Полсле -x AVX512 код запускается только на свежих интелевых процессорах. С openmp это никак не интерферирует. @simd, видимо, аналог более старого xSSE.
Ну, на самом деле процентов 20-30 медленнее - это вполне реально. Насколько я помню, обычно говорится, что Джулия - это где-то 1.1-1.2 от аналогичного сишного кода.
Фортран вроде бы в той же нише, что и с находится, так что такая разница вполне реальна.
Хотя всё равно думаю, что если постараться то можно ещё немного выжать 😊 Но это конечно отдельный вопрос, где проходит граница между оптимизацией и другим по сути алгоритмом.
Например, я бы вынес все аллокации массивов вовне. Если есть какой-то здоровый переиспользуемый кусок памяти, то лучше его заалоцировать один раз.
Хотя всё равно думаю, что если постараться то можно ещё немного выжать 😊 Но это конечно отдельный вопрос, где проходит граница между оптимизацией и другим по сути алгоритмом.
Например, я бы вынес все аллокации массивов вовне. Если есть какой-то здоровый переиспользуемый кусок памяти, то лучше его заалоцировать один раз.
А, понятно. Там надо на всякий случай проверить что нестабильностей никаких нет, передача функции в качестве аргументов может иногда к не очень хорошим результатам приводить.
Можно было бы аллоцировать flx fly и q в operator.jl, но тогда код будет уже менее красив, чем фортрановский), а этого не хочется. В фортране аналоги этих массивов- automatic arrays, тоже аллоцируются при каждом вызове функции, но если повезет, то в стэке, а не в куче.
А, понятно. Там надо на всякий случай проверить что нестабильностей никаких нет, передача функции в качестве аргументов может иногда к не очень хорошим результатам приводить.
и дальше уже пользоваться второй матрицей. Ну и время затраченное на транспонирование может съесть весь прирост от использования правильного размещения в памяти.
и дальше уже пользоваться второй матрицей. Ну и время затраченное на транспонирование может съесть весь прирост от использования правильного размещения в памяти.