SIMD - SIMD
Эта статья фактическая точность могут быть скомпрометированы из-за устаревшей информации.Март 2017 г.) ( |
Таксономия Флинна |
---|
Единый поток данных |
Несколько потоков данных |
Одна инструкция, несколько данных (SIMD) является классом параллельные компьютеры в Таксономия Флинна.[требуется разъяснение ] Он описывает компьютеры с несколько элементов обработки которые выполняют одну и ту же операцию с несколькими точками данных одновременно. Такие машины эксплуатируют параллелизм на уровне данных, но нет параллелизм: есть одновременные (параллельные) вычисления, но только один процесс (инструкция) в данный момент. SIMD особенно подходит для общих задач, таких как регулировка контрастности в цифровое изображение или регулируя громкость цифровой звук. Самый современный ЦПУ конструкции включают инструкции SIMD для повышения производительности мультимедиа использовать. SIMD не следует путать с SIMT, который использует потоки.
История
Первое использование инструкций SIMD было в ИЛЛИАК IV, который был завершен в 1966 году.
SIMD была основой для вектор суперкомпьютеры начала 1970-х, таких как CDC Star-100 и Техасские инструменты ASC, который может работать с «вектором» данных с помощью одной инструкции. Особую популярность векторной обработки получили Cray в 1970-1980-х гг. Архитектуры векторной обработки теперь считаются отдельными от компьютеров SIMD, исходя из того факта, что векторные компьютеры обрабатывали векторы по одному слову за раз через конвейерные процессоры (хотя все еще основаны на одной инструкции), тогда как современные компьютеры SIMD обрабатывают все элементы вектора. одновременно.[1]
Первая эра современных компьютеров SIMD характеризовалась массовая параллельная обработка -стиль суперкомпьютеры такой как Думающие машины CM-1 и CM-2. На этих компьютерах было много процессоров с ограниченной функциональностью, которые могли работать параллельно. Например, каждый из 65 536 однобитовых процессоров в Thinking Machines CM-2 будет выполнять одну и ту же инструкцию в одно и то же время, позволяя, например, логически объединить 65 536 пар бит за раз, используя сеть, соединенную с гиперкубом или ОЗУ, выделенное процессору, для поиска его операндов. Супервычисления отошли от подхода SIMD, когда недорогой скалярный MIMD подходы, основанные на товарных процессорах, таких как Intel i860 XP[2] стал более мощным, а интерес к SIMD ослаб.
Нынешняя эра процессоров SIMD выросла из рынка настольных компьютеров, а не из рынка суперкомпьютеров. Поскольку настольные процессоры стали достаточно мощными, чтобы поддерживать игры в реальном времени и обработку аудио / видео в течение 1990-х годов, спрос на этот конкретный тип вычислительной мощности вырос, и производители микропроцессоров обратились к SIMD, чтобы удовлетворить спрос.[3] Представлен Hewlett-Packard МАКСИМУМ инструкции в PA-RISC 1.1 в 1994 году для ускорения декодирования MPEG.[4] Sun Microsystems представила целочисленные инструкции SIMD в своем "ВИС "расширения набора команд в 1995 году, в его UltraSPARC I микропроцессор. MIPS последовали их примеру, выпустив аналогичные MDMX система.
Первый широко распространенный настольный SIMD был разработан Intel MMX расширения к x86 архитектуры в 1996 году. Это привело к появлению гораздо более мощных AltiVec система в Motorola PowerPC и IBM МОЩНОСТЬ системы. Intel ответила в 1999 году, представив совершенно новый SSE система. С тех пор было несколько расширений наборов инструкций SIMD для обеих архитектур.[5]
Все эти разработки были ориентированы на поддержку графики в реальном времени и, следовательно, ориентированы на обработку в двух, трех или четырех измерениях, обычно с длиной вектора от двух до шестнадцати слов, в зависимости от типа данных и архитектуры. Когда необходимо отличать новые архитектуры SIMD от старых, более новые архитектуры считаются архитектурами с «короткими векторами», поскольку более ранние суперкомпьютеры SIMD и векторные имели длину вектора от 64 до 64000. Современный суперкомпьютер почти всегда представляет собой кластер компьютеров MIMD, каждый из которых реализует инструкции SIMD (короткие векторные). Современный настольный компьютер часто представляет собой многопроцессорный компьютер MIMD, где каждый процессор может выполнять инструкции SIMD с коротким вектором.
Преимущества
Приложение, которое может использовать SIMD, - это приложение, в котором одно и то же значение добавляется (или вычитается из) большого количества точек данных, что является обычной операцией во многих мультимедиа Приложения. Одним из примеров может быть изменение яркости изображения. Каждый пиксель изображения состоит из трех значений яркости красной (R), зеленой (G) и синей (B) частей цвета. Для изменения яркости значения R, G и B считываются из памяти, к ним добавляется (или вычитается) значение, а полученные значения записываются обратно в память.
В процессоре SIMD есть два улучшения в этом процессе. С одной стороны, данные понимаются как блоки, и сразу несколько значений могут быть загружены. Вместо серии инструкций, говорящих «получить этот пиксель, теперь получить следующий пиксель», процессор SIMD будет иметь единственную инструкцию, которая фактически говорит «получить n пикселей» (где n - число, которое варьируется от проекта к проекту). По разным причинам это может занять гораздо меньше времени, чем получение каждого пикселя по отдельности, как при традиционной конструкции ЦП.
Еще одно преимущество состоит в том, что инструкция обрабатывает все загруженные данные за одну операцию. Другими словами, если система SIMD работает, загружая сразу восемь точек данных, Добавить
операция, применяемая к данным, будет происходить со всеми восемью значениями одновременно. Этот параллелизм отличается от параллелизма, обеспечиваемого суперскалярный процессор; восемь значений обрабатываются параллельно даже на не суперскалярном процессоре, и суперскалярный процессор может выполнять несколько операций SIMD параллельно.
Недостатки
- Не все алгоритмы легко векторизовать. Например, задача с тяжелым контролем потока, такая как код разбор может нелегко получить выгоду от SIMD; однако теоретически можно векторизовать сравнения и "пакетный поток" для достижения максимальной оптимальности кеша, хотя этот метод потребует более промежуточного состояния. Примечание. Системы пакетного конвейера (например, графические процессоры или конвейеры растеризации программного обеспечения) наиболее полезны для управления кешем при реализации с внутренними функциями SIMD, но они не являются исключительными для функций SIMD. Дополнительная сложность может быть очевидной, чтобы избежать зависимости внутри ряда, такого как строки кода; в то время как для векторизации требуется независимость.
- Большие регистровые файлы, увеличивающие энергопотребление и требуемую площадь чипа.
- В настоящее время реализация алгоритма с инструкциями SIMD обычно требует человеческого труда; большинство компиляторов не генерируют инструкции SIMD из типичного C программа, например. Автоматическая векторизация в компиляторах - активная область компьютерных исследований. (Сравнивать векторная обработка.)
- Программирование с использованием определенных наборов инструкций SIMD может включать в себя множество задач низкого уровня.
- SIMD может иметь ограничения на выравнивание данных; программисты, знакомые с одной конкретной архитектурой, могут этого не ожидать.
- Сбор данных в регистры SIMD и их рассылка по правильным адресатам - сложная задача (иногда требующая операций перестановки) и может быть неэффективной.
- Конкретные инструкции, такие как поворот или сложение трех операндов, недоступны в некоторых наборах инструкций SIMD.
- Наборы команд зависят от архитектуры: в некоторых процессорах полностью отсутствуют инструкции SIMD, поэтому программисты должны предоставлять для них не векторизованные реализации (или другие векторизованные реализации).
- Различные архитектуры предоставляют разные размеры регистров (например, 64, 128, 256 и 512 бит) и наборы команд, что означает, что программисты должны предоставить несколько реализаций векторизованного кода для оптимальной работы на любом заданном ЦП. Кроме того, возможный набор инструкций SIMD растет с каждым новым размером регистра.
- Рано MMX набор команд разделял регистровый файл со стеком с плавающей запятой, что приводило к неэффективности при смешивании кода с плавающей запятой и кода MMX. Тем не мение, SSE2 исправляет это.
Чтобы устранить проблемы 1 и 5, RISC-V векторное расширение и ARM Масштабируемое расширение вектора используйте альтернативный подход: вместо того, чтобы открывать программисту детали уровня подрегистра, набор команд абстрагирует их как несколько «векторных регистров», которые используют одни и те же интерфейсы для всех процессоров с этим набором команд. Аппаратное обеспечение решает все проблемы с выравниванием и «извлечением» петель. Машины с разными размерами векторов могут запускать один и тот же код.[6] LLVM называет этот векторный тип «vscale».
Хронология
Примеры суперкомпьютеров SIMD (не включая векторные процессоры ):
- ИЛЛИАК IV, c. 1974 г.
- Процессор распределенных массивов ICL (DAP), гр. 1974 г.
- Научный процессор Берроуза, c. 1976 г.
- Геометрическо-арифметический параллельный процессор, из Мартин Мариетта, начиная с 1981 г., продолжил Локхид Мартин, затем на Teranex и Кремний Optix
- Массивно-параллельный процессор (MPP), от НАСА /Центр космических полетов Годдарда, c. 1983–1991
- Соединительная машина, модели 1 и 2 (CM-1 и CM-2), от Корпорация Thinking Machines, c. 1985 г.
- MasPar МП-1 и МП-2, г. 1987–1996
- Компьютер Zephyr DC от Wavetracer, c. 1991 г.
- Xplor, из Pyxsys, Inc., c. 2001 г.
Аппаратное обеспечение
Маломасштабные (64 или 128 бит) SIMD стали популярными в процессорах общего назначения в начале 1990-х годов и продолжались до 1997 года, а затем с помощью видеоинструкций движения (MVI) для Альфа. Инструкции SIMD можно найти в той или иной степени на большинстве процессоров, включая IBM с AltiVec и SPE за PowerPC, HP с PA-RISC Расширения мультимедийного ускорения (МАКСИМУМ), Intel с MMX и iwMMXt, SSE, SSE2, SSE3 SSSE3 и SSE4.x, AMD с 3DNow!, ARC подсистема ARC Video, SPARC с ВИС и VIS2, солнце с MAJC, РУКА с Неон технологии, MIPS ' MDMX (MaDMaX) и MIPS-3D. IBM, Sony и Toshiba совместно разработали Сотовый процессор с СПУ Набор инструкций в значительной степени основан на SIMD. Philips, сейчас же NXP, разработал несколько процессоров SIMD, названных Xetal. Xetal имеет 320 16-битных процессорных элементов, специально разработанных для задач зрения.
Современное графические процессоры (Графические процессоры) часто представляют собой широкие реализации SIMD, способные выполнять ветвление, загрузку и хранение по 128 или 256 бит за раз.
Последний AVX-512 Инструкции SIMD теперь обрабатывают 512 бит данных одновременно.
Программного обеспечения
Инструкции SIMD широко используются для обработки 3D-графики, хотя современные видеокарты со встроенным SIMD в значительной степени взяли на себя эту задачу от ЦП. Некоторые системы также включают функции перестановки, которые повторно упаковывают элементы внутри векторов, что делает их особенно полезными для обработки и сжатия данных. Они также используются в криптографии.[7][8][9] Тенденция универсальных вычислений на GPU (ГПГПУ ) может привести к более широкому использованию SIMD в будущем.
Внедрение SIMD-систем в персональный компьютер программное обеспечение сначала было медленным из-за ряда проблем. Во-первых, многие из ранних наборов инструкций SIMD имели тенденцию снижать общую производительность системы из-за повторного использования существующих регистров с плавающей запятой. Другие системы, например MMX и 3DNow!, предлагал поддержку типов данных, которые не были интересны широкой аудитории, и имел дорогостоящие инструкции переключения контекста для переключения между использованием FPU и MMX регистры. Компиляторам также часто не хватало поддержки, что заставляло программистов прибегать к язык ассемблера кодирование.
SIMD включен x86 был медленный старт. Вступление к 3DNow! к AMD и SSE к Intel Несколько запутало вопросы, но сегодня система, похоже, успокоилась (после того, как AMD приняла SSE), и новые компиляторы должны привести к большему количеству программного обеспечения с поддержкой SIMD. Intel и AMD теперь предоставляют оптимизированные математические библиотеки, использующие инструкции SIMD, и альтернативы с открытым исходным кодом, такие как libSIMD, SIMDx86 и СЛИФ начали появляться (см. также libm ).[10]
Компьютер Apple имели несколько больший успех, хотя вышли на рынок SIMD позже остальных. AltiVec предлагает богатую систему и может быть запрограммирована с использованием все более сложных компиляторов из Motorola, IBM и GNU, поэтому программирование на ассемблере требуется редко. Кроме того, многие системы, которые выиграют от SIMD, были поставлены самой Apple, например iTunes и QuickTime. Однако в 2006 году компьютеры Apple перешли на процессоры Intel x86. Apple API и Инструменты разработки (XCode ) были изменены для поддержки SSE2 и SSE3 а также AltiVec. Apple была основным покупателем чипов PowerPC у IBM и Freescale Semiconductor и хотя они отказались от платформы, дальнейшее развитие AltiVec продолжается в нескольких PowerPC и Питание ISA дизайн от Freescale и IBM.
SIMD в регистре, или же SWAR, представляет собой набор методов и приемов, используемых для выполнения SIMD в регистрах общего назначения на оборудовании, которое не обеспечивает прямой поддержки инструкций SIMD. Это можно использовать для использования параллелизма в определенных алгоритмах даже на оборудовании, которое не поддерживает SIMD напрямую.
Интерфейс программиста
Издатели наборов инструкций SIMD обычно создают свои собственные расширения языка C / C ++ с внутренние функции или специальные типы данных, гарантирующие генерацию векторного кода. Intel, AltiVec и ARM NEON предоставляют расширения, широко используемые компиляторами для их процессоров. (Более сложные операции - задача векторных математических библиотек.)
В Компилятор GNU C продвигает расширения на шаг вперед, превращая их в универсальный интерфейс, который можно использовать на любой платформе, предоставляя способ определения типов данных SIMD.[11] В LLVM Компилятор Clang также реализует эту функцию с аналогичным интерфейсом, определенным в IR.[12] Крейт Pack_simd в Rust использует этот интерфейс, как и Быстрый 2.0+.
C ++ имеет экспериментальный интерфейс std :: экспериментальный :: simd
который работает аналогично расширению GCC. Кажется, это реализована в libcxx LLVM. Для GCC и libstdc ++ доступна библиотека-оболочка, которая строится поверх расширения GCC.[13]
Microsoft добавлен SIMD в .СЕТЬ в RyuJIT.[14] В System.Numerics.Vector
пакет, доступный в NuGet, реализует типы данных SIMD.[15]
Вместо того, чтобы предоставлять тип данных SIMD, компиляторы также могут получить указание на автоматическую векторизацию некоторых циклов, потенциально принимая некоторые утверждения об отсутствии зависимости данных. Это не так гибко, как прямое управление переменными SIMD, но проще в использовании. OpenMP 4.0+ имеет #pragma omp simd
намекать.[16] Силк имеет аналогичную функцию #pragma simd
.[17] GCC и Clang также имеют свои собственные частные прагмы для векторизации циклов, но все три были сделаны устаревшими OpenMP.
Поддержка нескольких версий SIMD
Обычно ожидается, что потребительское программное обеспечение будет работать на ряде процессоров, охватывающих несколько поколений, что может ограничить способность программиста использовать новые инструкции SIMD для повышения вычислительной производительности программы. Решение состоит в том, чтобы включить несколько версий одного и того же кода, в котором используются либо старые, либо новые технологии SIMD, и выбрать ту, которая лучше всего соответствует процессору пользователя во время выполнения (динамическая отправка ). Есть два основных лагеря решений:
- Мультиверсификация функций: a подпрограмма в программе или библиотеке дублируется и компилируется для многих расширений набора команд, и программа решает, какое из них использовать во время выполнения.
- Мультиверсификация библиотеки: вся библиотека программирования дублируется для многих расширений набора команд, и операционная система или программа решает, какое из них загружать во время выполнения.
Первое решение поддерживается Компилятор Intel C ++, Коллекция компиляторов GNU начиная с GCC 6 и Лязг поскольку clang 7. Однако, поскольку GCC и clang требуют явного target_clones
метки для «клонирования» функций, более простой способ сделать это - скомпилировать несколько версий библиотеки и позволить системе glibc выберите один - подход, принятый в проекте Clear Linux, поддерживаемом Intel.[18]
В Язык программирования Rust также поддерживает несколько версий. Клонирование может быть выполнено путем вызова исходной функции, так что встраивание вступает во владение.[19]
SIMD в сети
В 2013 году Джон Маккатчан объявил, что создал высокопроизводительный интерфейс для наборов инструкций SIMD для Дротик язык программирования, впервые привносящий преимущества SIMD в веб-программы. Интерфейс состоит из двух типов:[20]
- Float32x4, 4 значения с плавающей запятой одинарной точности.
- Int32x4, 4 32-битных целых числа.
Экземпляры этих типов неизменяемы и в оптимизированном коде отображаются непосредственно в регистры SIMD. Операции, выраженные в Dart, обычно компилируются в одну инструкцию без каких-либо накладных расходов. Это похоже на встроенные функции C и C ++. Контрольные показатели для 4×4 матричное умножение, 3D преобразование вершин, и Набор Мандельброта визуализация показывает ускорение почти на 400% по сравнению со скалярным кодом, написанным на Dart.
Работа Маккатчана над Dart, которая теперь называется SIMD.js, была принята ECMAScript и Intel объявили на IDF 2013, что они внедряют спецификацию Маккатчана для обоих V8 и ПаукОбезьяна.[21] Однако к 2017 году SIMD.js был исключен из стандартной очереди ECMAScript в пользу использования аналогичного интерфейса в WebAssembly.[22] По состоянию на август 2020 года интерфейс WebAssembly остается незавершенным, но его портативная 128-битная функция SIMD уже нашла свое применение во многих движках.
Emscripten, компилятор Mozilla C / C ++ - to-JavaScript, с расширениями, может включать компиляцию программ C ++, которые используют встроенные функции SIMD или векторный код в стиле GCC, в SIMD API JavaScript, что приводит к эквивалентному ускорению по сравнению со скалярным кодом.[23] Он также поддерживает 128-битное предложение SIMD WebAssembly.[24]
Коммерческие приложения
Хотя, как правило, оказалось трудно найти устойчивые коммерческие приложения для процессоров, поддерживающих только SIMD, одним из наиболее успешных вариантов является GAPP, который был разработан Локхид Мартин и переведены в коммерческий сектор путем их выделения Teranex. Недавние воплощения GAPP стали мощным инструментом в реальном времени. обработка видео приложения, такие как преобразование между различными стандартами видео и частотой кадров (NTSC в / из PAL, NTSC в / из HDTV форматы и др.), деинтерлейсинг, уменьшение шума изображения, адаптивный сжатие видео, и улучшение изображения.
Более распространенное приложение для SIMD находится в видеоигры: почти каждый современный игровая приставка поскольку 1998 где-то в своей архитектуре встроен процессор SIMD. В PlayStation 2 был необычен тем, что один из его векторных поплавков мог функционировать как автономный DSP выполняющий свой собственный поток инструкций, или как сопроцессор, управляемый обычными инструкциями ЦП. Приложения 3D-графики, как правило, хорошо поддаются обработке SIMD, поскольку они в значительной степени полагаются на операции с 4-мерными векторами. Microsoft с Direct3D 9.0 теперь выбирает во время выполнения специфичные для процессора реализации собственных математических операций, включая использование команд с поддержкой SIMD.
Одним из последних процессоров, использующих векторную обработку, является Сотовый процессор разработан IBM совместно с Toshiba и Sony. Он использует несколько процессоров SIMD ( NUMA архитектура, каждый с независимым местный магазин и управляется центральным процессором общего назначения) и ориентирована на огромные наборы данных, необходимые для приложений обработки 3D и видео. Он отличается от традиционных ISA тем, что изначально является SIMD без отдельных скалярных регистров.
Ziilabs произвела процессор типа SIMD для использования на мобильных устройствах, таких как медиаплееры и мобильные телефоны.[25]
Коммерческие процессоры SIMD большего размера доступны от ClearSpeed Technology, Ltd. и Stream Processors, Inc. ClearSpeed CSX600 (2004) имеет 96 ядер, каждое с двумя модулями с плавающей запятой двойной точности, в то время как CSX700 (2008) имеет 192. Потоковые процессоры возглавляет компьютерный архитектор. Билл Далли. Их процессор Storm-1 (2007) содержит 80 ядер SIMD, управляемых процессором MIPS.
Смотрите также
- Потоковые расширения SIMD, MMX, SSE2, SSE3, Расширенные векторные расширения, AVX-512
- архитектура набора команд
- SIMD в регистре (SWAR)
- Одна программа, несколько данных (SPMD)
- OpenCL
Рекомендации
- ^ Паттерсон, Дэвид А.; Хеннесси, Джон Л. (1998). Организация и дизайн компьютера: аппаратно-программный интерфейс (2-е изд.). Морган Кауфманн. п.751. ISBN 155860491X.
- ^ «MIMD1 - XP / S, CM-5» (PDF).
- ^ Conte, G .; Tommesani, S .; Заничелли, Ф. (2000). «Долгий и извилистый путь к высокопроизводительной обработке изображений с помощью MMX / SSE». Proc. Пятый международный семинар IEEE по компьютерным архитектурам для машинного восприятия. Дои:10.1109 / CAMP.2000.875989. HDL:11381/2297671. S2CID 13180531.
- ^ Ли, Р. Б. (1995). «Видео в формате MPEG в реальном времени посредством программной декомпрессии на процессоре PA-RISC». сборник бумаг Compcon 95 года. Технологии для информационной супермагистрали. С. 186–192. Дои:10.1109 / CMPCON.1995.512384. ISBN 0-8186-7029-0.
- ^ Миттал, Спарш; Ананд, Ошо; Кумар, Вишну П. (май 2019 г.). «Обзор по оценке и оптимизации производительности Intel Xeon Phi».
- ^ Паттерсон, Дэвид; Уотерман, Эндрю (18 сентября 2017 г.). «Инструкции SIMD считаются вредными». СИГАРЧ.
- ^ RE: скорость SSE2, показывающий, как SSE2 используется для реализации алгоритмов хеширования SHA
- ^ Сальса20 скорость; Программное обеспечение Salsa20, показывающий потоковый шифр, реализованный с использованием SSE2
- ^ Тема: пропускная способность RSA до 1,4x с использованием SSE2, показывающий RSA, реализованный с использованием инструкции целочисленного умножения SSE2, отличной от SIMD.
- ^ "Математические функции библиотеки SIMD". Переполнение стека. Получено 16 января 2020.
- ^ "Векторные расширения". Использование коллекции компиляторов GNU (GCC). Получено 16 января 2020.
- ^ "Расширения языка Clang". Документация Clang 11. Получено 16 января 2020.
- ^ "VcDevel / std-simd". VcDevel. 6 августа 2020.
- ^ «RyuJIT: JIT-компилятор нового поколения для .NET».
- ^ «Наконец-то JIT предложила. JIT и SIMD женятся».
- ^ «Директивы SIMD». www.openmp.org.
- ^ "Учебник pragma simd". CilkPlus. 18 июля 2012 г.
- ^ «Прозрачное использование пакетов библиотек, оптимизированных для архитектуры Intel®». Очистить проект Linux *. Получено 8 сентября 2019.
- ^ "2045-цель-особенность". Книга RFC Rust.
- ^ Джон Маккатчан. «Перенос SIMD в Интернет через Dart» (PDF). Архивировано из оригинал (PDF) на 2013-12-03.
- ^ «SIMD в JavaScript». 01.org. 8 мая 2014.
- ^ "tc39 / ecmascript_simd: числовой тип SIMD для EcmaScript". GitHub. Ecma TC39. 22 августа 2019 г.. Получено 8 сентября 2019.
- ^ Дженсен, Питер; Джибаджа, Иван; Ху, Нинсинь; Гохман, Дэн; Маккатчан, Джон (2015). «SIMD в JavaScript через C ++ и Emscripten» (PDF). Цитировать журнал требует
| журнал =
(помощь) - ^ «Перенос SIMD-кода на WebAssembly». Документация Emscripten 1.40.1.
- ^ "Медиа-процессор ZiiLABS ZMS-05 ARM 9". ZiiLabs. Архивировано из оригинал на 2011-07-18. Получено 2010-05-24.
внешняя ссылка
- Архитектуры SIMD (2000)
- Взломать Pentium 3 (1999)
- Короткие векторные расширения в коммерческих микропроцессорах
- Статья об оптимизации конвейера рендеринга анимированных моделей с использованием расширений Intel Streaming SIMD
- «Yeppp!»: Кроссплатформенная библиотека SIMD с открытым исходным кодом от Технологического института Джорджии.
- Введение в параллельные вычисления от Ливерморской национальной лаборатории LLNL
- Simde на GitHub: Переносимая реализация встроенных функций для других платформ (например, встроенных функций SSE для ARM NEON) с использованием заголовков C / C ++.