#simd #zig
Вопрос:
После реализации некоторой векторной алгебры, основанной на общих алгоритмах и итераторах, я решил запустить некоторые тесты. Идея состояла в том, чтобы сравнить производительность пользовательских векторов с meta.Vector
производительностью s (выполнение сложения и масштабирования).
Когда размер векторов был установлен на 10, пользовательские векторы немного превосходили meta.Vector
s. Когда размер векторов был установлен на 100, meta.Vector
s немного превосходил пользовательские векторы. Когда размер векторов был установлен на 1000, пользовательские векторы выполняли сложение в два раза медленнее, чем meta.Vector
s, и масштабирование-немного медленнее, чем meta.Vector
s (использование @splat
).
Самое смешное-это время компиляции-оно росло с ростом размера векторов (не измерялось, не могу сказать, было ли время компиляции линейным по размеру векторов). Когда размер векторов был установлен на 10_000, я в конце концов (после долгого ожидания) получил shell returned 137
сообщение об ошибке (во время компиляции); после того , как я прокомментировал любое упоминание meta.Vector
, код был скомпилирован просто отлично.
Итак, мой вопрос в том, что это за (компилятор?) темная магия заставляет meta.Vector
s размером 1000 работать так быстро, и могу ли я использовать ее для ускорения своего кода?
P. S.: тесты были запущены с-O ReleaseFast, все переменные были отмечены var
P. P. S.: в режиме отладки код с размером meta.Vector
s 10_000 в конечном итоге скомпилирован
Ответ №1:
AFAIK все, что он делает, — это явно использует поддержку SIMD LLVM.