Size: a a a

Язык программирования Julia / Julia programming language

2020 May 22

VG

Viktor G. in Язык программирования Julia / Julia programming language
Vladimir Shashkin
Но все равно не понимаю, срез массива присваивается в срез массива, почему там без view идут аллокации?
срезы делают копию по умолчанию, насколько я знаю
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
Vladimir Shashkin
Т.е. я правильно понимаю, что simd это не про выполнение на нескольких ядрах процессора(с параллелизмом по данным итд), а про использование векторных операций?
Да
источник

VS

Vladimir Shashkin in Язык программирования Julia / Julia programming language
@simd не дает значимого эффекта, к сожалению. Даже с вариантом, когда потоковая схема "захардкожена" внутрь цикла. Там в функции плохие операторы стоят, типа sign
источник

VS

Vladimir Shashkin in Язык программирования Julia / Julia programming language
Правильно ли я понимаю, avx это тоже самое, но специфичное для интелевых процессоров?
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
Насколько я понимаю, @simd (как операция) появился в языке достаточно давно, @avx это что-то более новое и экспериментальное (и вообще разрабатывается не core командой). Насколько я знаю, @avx более сложно устроен и использует более широкий набор операций, но за счёт этого у него похуже покрытие.
источник

VS

Vladimir Shashkin in Язык программирования Julia / Julia programming language
Спасибо. У ifort есть ключики -xSSE, -xAVX, -xAVX512. Судя по ассемблеру, последние 2 включают автовекторизацию циклов с использованием продвинутых векторных регистров и комманд. Полсле  -x AVX512 код запускается только на свежих интелевых процессорах. С openmp это никак не интерферирует. @simd, видимо, аналог более старого xSSE.
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
Да.
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
Ну, на самом деле процентов 20-30 медленнее - это вполне реально.
Насколько я помню, обычно говорится, что Джулия - это где-то 1.1-1.2 от аналогичного сишного кода.

Фортран вроде бы в той же нише, что и с находится, так что такая разница вполне реальна.
источник

VS

Vladimir Shashkin in Язык программирования Julia / Julia programming language
Поменял везде @avx на @simd результат тотже
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
Хотя всё равно думаю, что если постараться то можно ещё немного выжать 😊 Но это конечно отдельный вопрос, где проходит граница между оптимизацией и другим по сути алгоритмом.

Например, я бы вынес все аллокации массивов вовне. Если есть какой-то здоровый переиспользуемый кусок памяти, то лучше его заалоцировать один раз.

Это я про https://github.com/vvshashkin/fortran_julia_bench/blob/master/advection/julia_code/operator.jl#L11-L12

Но с другой стороны, если это и даст какую-то прибавку, то тоже самое можно и в фортране сделать, так что это не совсем уже честное сравнение.
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
А где определена функция fluxf? Никак не могу найти её в тексте.
источник

VS

Vladimir Shashkin in Язык программирования Julia / Julia programming language
Андрей Оськин
А где определена функция fluxf? Никак не могу найти её в тексте.
Она передается сверху как аргумент в operator
источник

VS

Vladimir Shashkin in Язык программирования Julia / Julia programming language
На данный момент это либо up4 либо weno5
источник

VS

Vladimir Shashkin in Язык программирования Julia / Julia programming language
Андрей Оськин
Хотя всё равно думаю, что если постараться то можно ещё немного выжать 😊 Но это конечно отдельный вопрос, где проходит граница между оптимизацией и другим по сути алгоритмом.

Например, я бы вынес все аллокации массивов вовне. Если есть какой-то здоровый переиспользуемый кусок памяти, то лучше его заалоцировать один раз.

Это я про https://github.com/vvshashkin/fortran_julia_bench/blob/master/advection/julia_code/operator.jl#L11-L12

Но с другой стороны, если это и даст какую-то прибавку, то тоже самое можно и в фортране сделать, так что это не совсем уже честное сравнение.
По принципу ну кисонька, еще капельку, можно и с фортрана выжать прлизводительности, но принципиально это ничего не измегит
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
А, понятно.
Там надо на всякий случай проверить что нестабильностей никаких нет, передача функции в качестве аргументов может иногда к не очень хорошим результатам приводить.

https://github.com/vvshashkin/fortran_julia_bench/blob/master/advection/julia_code/operator.jl#L28 - вот это место ещё неприятное. Здесь я так понимаю строчка вырезается? Так как Julia column major, то это плохо влияет на скорость вычислений.
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
Если можно это как-то изменить, то тоже может помочь.
источник

VS

Vladimir Shashkin in Язык программирования Julia / Julia programming language
Можно было бы аллоцировать flx fly и q в operator.jl, но тогда код будет уже менее красив, чем фортрановский), а этого не хочется. В фортране аналоги этих массивов- automatic arrays, тоже аллоцируются при каждом вызове функции, но если повезет, то в стэке, а не в куче.
источник

VS

Vladimir Shashkin in Язык программирования Julia / Julia programming language
Андрей Оськин
А, понятно.
Там надо на всякий случай проверить что нестабильностей никаких нет, передача функции в качестве аргументов может иногда к не очень хорошим результатам приводить.

https://github.com/vvshashkin/fortran_julia_bench/blob/master/advection/julia_code/operator.jl#L28 - вот это место ещё неприятное. Здесь я так понимаю строчка вырезается? Так как Julia column major, то это плохо влияет на скорость вычислений.
Да, это самое противное место всего алгоритма, но от этого никуда не денешься ни в фортране, ни в джулии
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
Если памяти не жалко, то можно конечно поменять
https://github.com/vvshashkin/fortran_julia_bench/blob/master/advection/julia_code/operator.jl#L90

с
return q1

на
return q1, permutedims(q1)


и дальше уже пользоваться второй матрицей. Ну и время затраченное на транспонирование может съесть весь прирост от использования правильного размещения в памяти.

Но это конечно тоже выглядит как читерство.
источник

VS

Vladimir Shashkin in Язык программирования Julia / Julia programming language
Андрей Оськин
Если памяти не жалко, то можно конечно поменять
https://github.com/vvshashkin/fortran_julia_bench/blob/master/advection/julia_code/operator.jl#L90

с
return q1

на
return q1, permutedims(q1)


и дальше уже пользоваться второй матрицей. Ну и время затраченное на транспонирование может съесть весь прирост от использования правильного размещения в памяти.

Но это конечно тоже выглядит как читерство.
Обычно эта игра не стоит того (по фортрановской практике), но попробовать можно, а память -да, не жалко
источник