Команда simd
Пакет simd реализует переносимые типы SIMD, не зависящие от размера вектора, а также функции и методы для работы с этими типами. Типы SIMD либо реализованы аппаратно (например, arm64 «Neon» или amd64 «AVX/AVX2/AVX512») с использованием соответствующих типов из пакета simd/archsimd, либо эмулируются на чистом Go. Во всех случаях длина вектора составляет не менее 128 бит, и в рамках одного выполнения программы все векторы имеют одинаковую длину.
Типы SIMD
Для каждого примитивного числового типа существует соответствующий тип simd, кроме complex64 и complex128. Имя каждого такого типа образовано из имени типа с заглавной буквы и суффикса «s», например Int8s, Uint16s или Float64s.
Также существуют типы simd «масок», которые абстрагируют регистры масок, присутствующие в некоторых архитектурах; в остальных случаях они реализуются как битовые маски.
Получение значений SIMD
Нулевое значение вектора SIMD допустимо и представляет собой нулевой вектор.
Для каждого типа SIMD функция «Load<Types>(s []<type>) <Types>» загружает полный вектор этого типа из достаточно длинного среза.
Для срезов недостаточной длины функция «Load<Types>Part(s []<type>) (<Types>, int)» загрузит из среза столько элементов, сколько доступно, заполнит оставшуюся часть нулями и также вернёт количество загруженных элементов.
Для каждого типа SIMD функция «Broadcast<Types>(x type) <Types>» возвращает вектор, все элементы которого инициализированы значением x.
Примеры:
Операции
Типы SIMD предоставляют методы для унарных (Float32s.Abs, Int16s.Not), бинарных (Float64s.Add, Uint32s.GreaterEqual) и тернарных операций (Int64s.IfElse, Float32s.MulAdd). Операции сравнения возвращают маски.
Типы SIMD также поддерживают преобразования между типами: как преобразования, в основном сохраняющие значения (Int32s.ConvertToFloat32, Float32s.ConvertToInt32), так и преобразования типов без изменения базового битового шаблона вектора.
Типы целых чисел со знаком преобразуются в типы масок (Int16s.ToMask), но это сравнение с нулём, а не простое побитовое преобразование. Типы масок преобразуются в целые числа со знаком с помощью операции (Mask32s.ToInt32s), которая может быть бесплатным побитовым преобразованием, а может и не быть — это зависит от используемого оборудования.
Сохранение
Типы векторов SIMD имеют два метода: один для сохранения всего вектора в срез «Store([]<type>)» и второй для сохранения части вектора в срез «StorePart([]<type>) int». StorePart возвращает фактическое количество сохранённых элементов.
Преобразование в строку
Для преобразования векторов и масок в строки предусмотрен метод String.
Преобразование типов simd/archsimd
Для каждого типа вектора SIMD предусмотрен метод «ToArch() any», который возвращает тип, поддерживаемый текущим оборудованием, в виде значения типа «any». Код, использующий эти методы, необходимо собирать с соответствующими тегами архитектуры, а возвращаемое значение приводить к нужному типу.
Пакет simd также содержит обобщённые функции для преобразования значения simd/archsimd, зависящего от архитектуры (например, archsimd.Float32x4), в соответствующий тип simd. Эта функция вызовет панику, если соответствие неверно.
Пример преобразования между типами simd и arch/simd см. в файле тестов sum_amd64_test.go.
Ошибки
- ☞
Вызовы не работают; возможны и другие ошибки.
- ☞
Инициализаторы var, зависящие от SIMD, не работают.
- ☞
Изменённые имена могут появляться в трассировках стека и при отладке.
Подкаталоги
| Имя | Описание |
|---|---|
| .. | |
| archsimd | Пакет archsimd предоставляет доступ к SIMD-операциям, специфичным для архитектуры. |
© Google, Inc.
Licensed under the Creative Commons Attribution License 3.0.
http://golang.org/pkg/simd/