Одним из примеров, где могут быть полезны инструкции CD, является гистограммирование. Для скалярного кода гистограммирование только простой цикл, как это:
load bin index
load bin count at index
increment bin count
store updated bin count at index
Обычно вы не можете векторизации гистограммирования потому что вы можете иметь один и тот же индекс бен больше, чем один раз в векторе - Вы могли бы наивным попробовать что-то вроде этого:
load vector of N bin indices
perform gathered load using N bin indices to get N bin counts
increment N bin counts
store N updated bin counts using scattered store
, но если какой-либо из индексов в пределах вектора одинаковы, то вы получите конфликт, и в результате обновления бен будет некорректным.
Так, CD инструкция к спасению:
load vector of N bin indices
use CD instruction to test for duplicate indices
set mask for all unique indices
while mask not empty
perform masked gathered load using <N bin indices to get <N bin counts
increment <N bin counts
store <N updated bin counts using masked scattered store
remove non-masked indices and update mask
end
На практике этот пример не является малоэффективным и не лучше, чем скалярный код, но есть и другие более вычислительны ёмкие примеры, когда с помощью инструкции CD, кажется, стоит. Обычно это будут симуляции, в которых элементы данных будут обновляться недетерминированным образом. Один пример (из LAMMPS Molecular Dynamics Simulator) упоминается в KNL book by Jeffers et al.
Смотрите также [стр.50 слайдов Кириллом Юхин от 2014] (https://gcc.gnu.org/wiki/cauldron2014?action=AttachFile&do=get&target=Cauldron14_AVX-512_Vector_ISA_Kirill_Yukhin_20140711.pdf#page=50). Я опубликовал некоторые сведения об ускорении проблем типа гистограммы с/без AVX512CD [по недавнему вопросу] (https://stackoverflow.com/questions/39266476/how-to-speed-up-this-histogram-of-lut- поиски). Обычный трюк клонирования ваших бункеров и суммирования в конце может помочь избежать конфликтов (и узких мест, связанных с перенастройкой данных, даже для скаляров). –
Спасибо, Питер, я раньше не видел этих слайдов - некоторые интересные лакомые кусочки ... –
Раздел «16.2.3. Использование инструкций AVX-512CD» [Руководства по оптимизации Intel] (http://www.intel.com /content/www/us/en/architecture-and-technology/64-ia-32-architectures-optimization-manual.html) описывает это точно. См. Пример «Пример 16-4. Векторизованное обновление гистограммы с использованием AVX-512CD». Это где вы получили эту идею? Откуда вы знаете, что это не лучше скаляра? Вы пробовали это на практике с KNL? –