Документация по разработке
Основы FastTransforms.jl
разрабатываются параллельно с одноименной библиотекой C. Взаимодействие Julia и C улучшено благодаря инфраструктуре BinaryBuilder, которая предоставляет пользователю возможности безопасного и последовательного использования пакета на другом языке.
Почему два пакета?
Преобразования ортогональных многочленов являются актуальными задачами, зависящими от производительности. Тем не менее для определения этих вычислительных процедур не требуется большая часть широких и развивающихся возможностей языка Julia. Более того, быстрые изменения языка Julia (по сравнению с C) в прошлом стали сильным возмущением для этого репозитория.
Библиотека C генерирует сборку для векторизованных операций, например для операций с одной инструкцией и несколькими данными (SIMD), более эффективную, чем та, которая генерируется компилятором без вмешательства человека. Она также использует OpenMP для внедрения параллелизма общей памяти для больших задач. Наконец, обращение к предварительно скомпилированным двоичным файлам уменьшает объем предварительной компиляции и количество зависимостей пакета Julia, что улучшает работу пользователя. Некоторые из этих возможностей есть и в Julia, но в C присутствует явно больше контроля над производительностью.
Библиотеки C проще вызывать из любого другого языка, что отчасти объясняет, почему диспетчер пакетов Python Spack уже поддерживает библиотеки C благодаря усилиям сторонних разработчиков.
В Julia параметрический составной тип с неограниченными параметрами типа почти настолько же велик, как Any
. Благодаря ему API Julia значительно превосходят API C в способности унифицировать все преобразования ортогональных многочленов и представить их в виде линейных операторов. mutable struct FTPlan{T, N, K}
, а также AdjointFTPlan
и TransposeFTPlan
являются основными типами Julia в этом репозитории. Если T
означает тип элемента плана, а N
— число ведущих измерений массива, в котором он работает, то K
— это простое перечисление, которое служит для различения ортогональных многочленов. Например, FTPlan{Float64, 1, LEG2CHEB}
представляет собой необходимые предварительные вычисления для преобразования 64-битного ряда Лежандра в ряд Чебышева (первого рода). N == 1
, поскольку ряды Чебышева и Лежандра естественным образом представлены векторами коэффициентов. Однако этот конкретный план может работать не только с векторами, но и с матрицами по столбцам.
Право разработчика на сборку из исходного кода
Предварительно скомпилированные двоичные файлы важны для пользователей, но разработка на C может значительно ускориться, если скомбинировать ее с динамическим языком, таким как Julia. По этой причине репозиторий сохраняет за разработчиком право собирать библиотеку C из исходного кода, задавая переменную окружения для запуска скрипта сборки:
julia> ENV["FT_BUILD_FROM_SOURCE"] = "true"
"true"
(@v1.5) pkg> build FastTransforms
Building FFTW ──────────→ `~/.julia/packages/FFTW/ayqyZ/deps/build.log`
Building TimeZones ─────→ `~/.julia/packages/TimeZones/K98G0/deps/build.log`
Building FastTransforms → `~/.julia/dev/FastTransforms/deps/build.log`
julia> using FastTransforms
[ Info: Precompiling FastTransforms [057dd010-8810-581a-b7be-e3fc3b93f78c]
Так разработчик может экспериментировать с новыми функциями, выполняя вызовы (ccall
) современного исходного кода. Дальнейшая настройка скрипта сборки позволяет разработчику отслеживать другую ветвь или даже вилку.
От выпуска до выпуска
Для перехода от выпуска библиотеки C к выпуску пакета Julia разработчику необходимо обновить скрипт build_tarballs.jl Yggdrasil для новой версии и ее 256-битного SHA. В macOS SHA можно найти, как показано далее:
shell> curl https://codeload.github.com/MikaelSlevinsky/FastTransforms/tar.gz/v0.6.2 --output FastTransforms.tar.gz
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 168k 0 168k 0 0 429k 0 --:--:-- --:--:-- --:--:-- 429k
shell> shasum -a 256 FastTransforms.tar.gz
fd00befcb0c20ba962a8744a7b9139355071ee95be70420de005b7c0f6e023aa FastTransforms.tar.gz
shell> rm -f FastTransforms.tar.gz
Используя SHA.jl, SHA можно также найти, как показано далее:
shell> curl https://codeload.github.com/MikaelSlevinsky/FastTransforms/tar.gz/v0.6.2 --output FastTransforms.tar.gz
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 168k 0 168k 0 0 442k 0 --:--:-- --:--:-- --:--:-- 443k
julia> using SHA
julia> open("FastTransforms.tar.gz") do f
bytes2hex(sha256(f))
end
"fd00befcb0c20ba962a8744a7b9139355071ee95be70420de005b7c0f6e023aa"
shell> rm -f FastTransforms.tar.gz
Затем мы ждем, пока специалисты из JuliaPackaging объединят запрос на вытягивание с Yggdrasil, что приведет к выпуску нового метапакета FastTransforms_jll.jl, в котором хранятся все предварительно скомпилированные двоичные файлы. С помощью этого выпуска можно обновить FastTransforms.jl Project.toml, чтобы указать на последний выпуск и зарегистрировать новую версию.
Поскольку разработка Yggdrasil идет довольно быстрыми темпами, вилка может легко устареть. Git позволяет разработчику принудительно создавать ветвь master в вилке даже при наличии вышестоящей ветви master:
git fetch upstream git checkout master git reset --hard upstream/master git push origin master --force