Spec-Zone.ru › Go

Команда 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.

Примеры:

  • LoadInt8s
  • LoadUint16sPart
  • BroadcastFloat32s

Операции

Типы 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/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API