AoS и SoA - AoS and SoA

В вычисление, Массив структур (AoS), Структура массивов (SoA) и Массив структур массивов (AoSoA) относятся к контрастным способам организации последовательности записи в объем памяти, в отношении к чередование, и представляют интерес SIMD и SIMT программирование.

Структура массивов

Структура массиваs (или SoA) - раскладка, разделяющая элементы запись (или "структура" в Язык программирования C ) в один параллельный массив на поле.[1] Мотивация - это более легкие манипуляции с упакованными Инструкции SIMD в большинстве архитектуры наборов команд, поскольку сингл Регистр SIMD может загрузить однородные данные, возможно, переданные широким внутренний канал данных (например. 128 бит ). Если требуется только определенная часть записи, нужно повторять только эти части, что позволяет разместить больше данных в одной строке кэша. Обратной стороной является необходимость большего способы кеширования при обходе данных и неэффективно индексированная адресация (смотрите также: планарный формат изображения ).

Например, чтобы сохранить N точек в трехмерном пространстве с помощью структуры массивов:

1 структура pointlist3D {2     плавать Икс[N];3     плавать у[N];4     плавать z[N];5 };6 структура pointlist3D точки;7 плавать get_point_x(int я) { вернуть точки.Икс[я]; }

Массив структур

Массив структурыs (или AoS) - это противоположный (и более традиционный) макет, в котором данные для разных полей чередуются. Это часто более интуитивно понятно и поддерживается большинством языки программирования.

Например, чтобы сохранить N точек в трехмерном пространстве с помощью массива структур:

1 структура point3D {2     плавать Икс;3     плавать у;4     плавать z;5 };6 структура point3D точки[N];7 плавать get_point_x(int я) { вернуть точки[я].Икс; }

Массив структур массивов

Массив структур массиваs (или AoSoA) представляет собой гибридный подход между предыдущими макетами, в котором данные для разных полей чередуются с использованием тайлов или блоков с размером, равным размеру вектора SIMD. Это часто менее интуитивно понятно, но может обеспечить пропускную способность памяти, аналогичную подходу SoA, и в то же время более дружественно к расположению кэша и архитектурам портов загрузки современных процессоров.[2]

Например, чтобы сохранить N точек в трехмерном пространстве с использованием массива структур массивов с шириной регистра SIMD 8:

1 структура point3Dx8 {2     плавать Икс[8];3     плавать у[8];4     плавать z[8];5 };6 структура point3Dx8 точки[(N+7)/8];7 плавать get_point_x(int я) { вернуть точки[я/8].Икс[я%8]; }

Альтернативы

Можно разделить некоторое подмножество структуры (а не каждое отдельное поле) на параллельный массив -, и это действительно может улучшить местонахождение ссылки если в программе в разное время используются разные части полей (см. ориентированный на данные дизайн ).

Немного SIMD архитектуры обеспечивают полосатые инструкции по загрузке / хранению для загрузки однородных данных из формата SoA. Еще один вариант, используемый в некоторых Ячейка библиотеки должны устранять чередование данных из формата AoS при загрузке источников в регистры и чередовать при записи результатов (чему способствует суперскалярная проблема из переставляет ). Немного векторные математические библиотеки выровнять плавающая точка 4D-векторы с регистром SIMD для использования связанного пути данных и инструкций, при этом обеспечивая удобство для программиста, хотя это не масштабируется до модулей SIMD шире четырех полос.

4D векторы

Сравнение AoS и SoA представляет собой выбор при рассмотрении трехмерных или четырехмерных векторных данных на машинах с четырехполосным оборудованием SIMD. SIMD ISA обычно предназначены для однородных данных, однако некоторые предоставляют скалярное произведение инструкция[3] и дополнительные перестановки, облегчающие рассмотрение дела AoS. Хотя большинство GPU оборудование перешло от 4D инструкций к скалярным SIMT трубопроводы,[4] современный вычислить ядра использование SoA может по-прежнему обеспечивать лучшую производительность за счет объединения памяти.[5]

Поддержка программного обеспечения

Большинство языков более естественно поддерживают формат AoS, комбинируя записи и различные массивы. абстрактные типы данных. SIMD-ориентированные особенности экспериментального Язык программирования JAI - недавняя попытка обеспечить поддержку SoA на уровне языка.[6] Юля поддерживает многомерные массивы с AoS или SoA (через пакет). В Datadraw Генератор кода создает структуры данных SoA для языка C. В X Macro технику препроцессора C можно использовать для заполнения SoA во время компиляции.

использованная литература

  1. ^ «Как управлять структурой данных для оптимизации использования памяти». Intel. 2012-02-09. Получено 2019-03-17.
  2. ^ «Преобразования макета памяти». Intel. 2019-03-26. Получено 2019-06-02.
  3. ^ «Особенности продукта Intel SSE4 с плавающей запятой». Intel. Архивировано из оригинал на 2016-06-24. Получено 2019-03-17.
  4. ^ «Современная архитектура GPU (см. Скалярные унифицированные конвейеры)» (PDF). NVIDIA. Архивировано из оригинал (PDF) на 2018-05-17. Получено 2019-03-17.
  5. ^ Ким, Хесун (2010-02-08). «Стратегии оптимизации CUDA» (PDF). Игровые консоли CS4803 Design. Получено 2019-03-17.
  6. ^ Удар, Джонатан (21.01.2015). «Демонстрация, ориентированная на данные: SoA, композиция». Получено 2019-03-17. Демонстрация функций, ориентированных на данные и SoA, на языке JAI, а также объяснение мотивации.