Сбор/разброс — это тип адресации памяти , который одновременно собирает (собирает) данные из нескольких произвольных индексов или сохраняет (разбрасывает) их. Примерами его использования являются разреженные операции линейной алгебры , [1] алгоритмы сортировки, быстрые преобразования Фурье , [2] и некоторые задачи теории вычислительных графов. [3] Это векторный эквивалент косвенной адресации регистров , при этом сбор включает индексированные чтения, а разброс — индексированные записи. Векторные процессоры (и некоторые блоки SIMD в ЦП ) имеют аппаратную поддержку для операций сбора и разброса, как и многие системы ввода/вывода , что позволяет быстрее передавать большие наборы данных в основную память .
Концепция несколько похожа на векторный ввод-вывод , который иногда также называют вводом-выводом типа scatter-gather. Эта система отличается тем, что она используется для отображения нескольких источников данных из смежных структур в один поток для чтения или записи. Распространенным примером является запись серии строк , которые в большинстве языков программирования будут храниться в отдельных ячейках памяти.
Редко заполненный вектор, содержащий непустые элементы, может быть представлен двумя плотно заполненными векторами длины ; содержащими непустые элементы , и дающими индекс в , где расположен элемент . Сборка в , обозначенная , присваивает с уже вычисленным. [4] Предполагая, что нет псевдонимов указателей между x[], y[], idx[], реализация C выглядит следующим образом:
для ( i = 0 ; i < N ; ++ i ) x [ i ] = y [ idx [ i ]];
Разреженный разброс, обозначенный как , является обратной операцией. Он копирует значения в соответствующие места в разреженно заполненном векторе , т.е. .
для ( i = 0 ; i < N ; ++ i ) y [ idx [ i ]] = x [ i ];
Устройства Scatter/gather также были частью большинства векторных компьютеров, в частности Cray-1 . В этом случае целью было эффективное хранение значений в ограниченном ресурсе векторных регистров. Например, Cray-1 имел восемь векторных регистров по 64 слова, поэтому данные, содержащие значения, не влияющие на результат, например нули при сложении, занимали ценное пространство, которое можно было бы использовать с большей пользой. Собирая ненулевые значения в регистрах и рассеивая результаты обратно, регистры можно было использовать гораздо эффективнее, что приводило к более высокой производительности. Такие машины обычно реализовывали две модели доступа: scatter/gather и «stride», последняя была разработана для быстрой загрузки смежных данных. [5] Эта базовая схема широко копировалась в более поздних конструкциях суперкомпьютеров , особенно в различных моделях из Японии.
По мере совершенствования конструкции микропроцессоров в 1990-х годах в массовые ЦП начали добавляться векторные процессоры. Сначала они были простыми, иногда перекрывая регистры общего назначения ЦП, но со временем они превратились во все более мощные системы, которые соответствовали, а затем и превосходили блоки в высокопроизводительных суперкомпьютерах. К этому времени во многие из этих конструкций были добавлены инструкции scatter/gather.
Процессоры x86-64 , поддерживающие набор инструкций AVX2, могут собирать 32- и 64-битные элементы со смещениями памяти от базового адреса. Второй регистр определяет, загружен ли конкретный элемент, и подавляются сбои, возникающие из-за недопустимого доступа к памяти замаскированными элементами. [6] : 503–4 Набор инструкций AVX-512 также содержит (потенциально замаскированные) операции рассеивания. [6] : 539 [7] Масштабируемое векторное расширение набора инструкций ARM включает операции сбора и рассеивания на 8-, 16-, 32- и 64-битных элементах. [8] [ 9] InfiniBand имеет аппаратную поддержку сбора/рассеивания. [10]
Без сбора/рассеивания на уровне инструкций эффективные реализации могут нуждаться в настройке для оптимальной производительности, например, с предварительной выборкой ; библиотеки, такие как OpenMPI, могут предоставлять такие примитивы. [2] [8]