что такое темная магия, стоящая за мета.Векторами?

#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.

https://ziglang.org/documentation/0.8.0/#Vectors