3

Узкое место традиционного последовательного цикла CPU

AI999第4课:现代计算底座与张量化并行演化
00:00

Эволюционный процесс опирается на разнообразие популяции, а разнообразие означает многократный рост размера популяции и числа оценок. Когда число оценок кандидатов достигает десятков тысяч,традиционный последовательный цикл CPU就成了整条流水线上最窄的一段:它一次只处理一个个体,硬件的并行能力几乎被闲置。

Последовательный цикл CPU и пакетный параллелизм: рост общего времени с числом оценок кандидатовПоследовательная поштучная обработкаПакетная параллельная обработкаВремя по часам (нормированное)≈ 100 сПоследовательно: почти линейный ростПараллельно: ступенчатый ростПоследовательно: взять особь → декодировать → оценить → записать обратноСоседние итерации не перекрываются, параллельные блоки в основном простаиваютПакетный параллелизм: организация по пакетам, время определяется числом пакетов10³ раз10⁴ раз10⁵ разЧисло оценок кандидатовПримечание: тёмные участки — накладные расходы на планирование и пересылку данных; при одинаковом объёме работы рост времени при параллелизме определяется главным образом числом пакетов, а не числом особей.

По одной за раз: модель выполнения последовательного цикла

Самая простая реализация рассматривает всю популяцию как список и в цикле поочерёдно извлекает особей: взять особь → декодировать в конкретные параметры → вызвать функцию оценки → записать приспособленность обратно. Соседние итерации почти не перекрываются: пока результат оценки не вернулся, запись не может продвинуться; пока запись не завершена, следующей особи некуда поместить результат. В итоге многоядерные, SIMD- и GPU-блоки большую часть времени простаивают, наблюдая, как одна особь проходит конвейер до конца.

Откуда же берутся накладные расходы

  • Линейно растущее число оценок: общее число оценок примерно равно размеру популяции × числу поколений; при достижении порядка 10⁵ время последовательного выполнения по часам растёт почти линейно.
  • Поштучное выполнение на уровне интерпретатора: поочерёдный цикл по особям, проверка границ и диспетчеризация типов дают фиксированные, но высокие постоянные накладные расходы.
  • Несогласованный доступ к памяти и пересылка данных: извлекаемые по одной особи часто расположены в памяти несогласованно, доля попаданий в кэш низкая, а затраты на пересылку оплачиваются снова и снова.
  • Синхронизация и планирование: чтобы получить следующую особь, поток выполнения вынужден снова и снова останавливаться и возобновляться.

Переводим масштаб во время

Возьмём популяцию из 1000 особей и 100 поколений — всего около 100 тысяч оценок кандидатов. Если одна оценка занимает в среднем 1 мс, только этап оценки последовательно потребует около 100 секунд, не считая затрат на вычисления операторов и планирование; если для поддержания разнообразия увеличить число перезапусков с 1 до 5, затраты почти линейно вырастут до примерно 500 секунд. Если тот же объём работы организовать по пакетам и передать параллельной аппаратуре, время по часам будет определяться главным образом числом пакетов, а не числом особей.

Когда это узкое место сужается

Граничные условия не менее важны: когда одна оценка крайне дешева (микросекунды) или популяция очень мала (порядка сотен), накладные расходы на планирование и память могут превысить вычислительные, разрыв между последовательным и параллельным выполнением заметно сокращается, предельная отдача от тензоризации падает, а узкое место смещается к гранулярности планирования и пропускной способности памяти. Поэтому целесообразность переработки модели выполнения нужно оценивать совместно с учётом стоимости оценки и масштаба.

Структурное узкое место, а не дефект кода
Узкое место последовательного цикла CPU лежит на уровне модели выполнения: точечная оптимизация кода его не устранит. Чтобы действительно решить проблему, нужно перестроить поштучную обработку в пакетную — пакетирование, тензоризация и параллельное планирование; это же служит непосредственным мотивом для последующего проектирования тензоризованного вычислительного графа.