АоС и СоА


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

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

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

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

Например, чтобы хранить N точек в 3D-пространстве, используя массив структур массивов с шириной регистра SIMD 8 с плавающей запятой (или 8×32 = 256 бит):

В зависимости от фактической ширины регистра SIMD может потребоваться другая ширина. Внутренние массивы могут быть заменены типами SIMD, например, float32x8для языков с такой поддержкой.