Введение

Эффективный алгоритм ввода-вывода, не зависящий от размера кэша. В вычислительной технике алгоритм, нечувствительный к кэшу (или алгоритм, превосходящий кэш), — это алгоритм, разработанный для использования кэша процессора без учета размера кэша (или длины кэш-линий и т. д.) в качестве явного параметра. Оптимальный алгоритм, нечувствительный к кэшу, — это алгоритм, нечувствительный к кэшу, который использует кэш оптимально (в асимптотическом смысле, игнорируя постоянные множители). Таким образом, алгоритм, нечувствительный к кэшу, предназначен для эффективной работы без изменений на различных машинах с разными размерами кэша или для иерархии памяти с разными уровнями кэша, имеющими разные размеры. Алгоритмы, нечувствительные к кэшу, противопоставляются явному разбиению циклов на блоки (loop tiling), которое явно разбивает задачу на блоки оптимального размера для заданного кэша. Оптимальные алгоритмы, нечувствительные к кэшу, известны для умножения матриц, транспонирования матриц, сортировки и ряда других задач. Некоторые более общие алгоритмы, такие как Cooley–Tukey FFT, оптимально нечувствительны к кэшу при определенных значениях параметров. Поскольку эти алгоритмы оптимальны только в асимптотическом смысле (игнорируя постоянные множители), для достижения почти оптимальной производительности в абсолютном выражении может потребоваться дополнительная настройка, специфичная для конкретной машины. Цель алгоритмов, нечувствительных к кэшу, — уменьшить объем необходимой настройки. Как правило, алгоритм, нечувствительный к кэшу, работает по рекурсивному принципу "разделяй и властвуй", где задача разбивается на все более мелкие подзадачи. В конечном итоге достигается размер подзадачи, который помещается в кэш, независимо от размера кэша. Например, оптимальное умножение матриц, нечувствительное к кэшу, достигается путем рекурсивного деления каждой матрицы на четыре подматрицы для умножения, умножая подматрицы в порядке глубины. При настройке для конкретной машины можно использовать гибридный алгоритм, который использует разбиение циклов на блоки, настроенное для конкретных размеров кэша на нижнем уровне, но в остальном использует алгоритм, нечувствительный к кэшу.

История

Идея (и название) алгоритмов, нечувствительных к кэшу, была выдвинута Чарльзом Лейзерсоном еще в 1996 году и впервые опубликована Харальдом Прокопом в его магистерской диссертации в Массачусетском технологическом институте в 1999 году. Существовало множество предшествующих работ, как правило, анализирующих конкретные задачи; они подробно рассматриваются в Frigo et al. 1999. К ранним примерам относятся Singleton 1969 года для рекурсивного быстрого преобразования Фурье, схожие идеи в Aggarwal et al. 1987, Frigo 1996 для умножения матриц и LU-разложения, а также Todd Veldhuizen 1996 для матричных алгоритмов в библиотеке Blitz++.