Я изучаю планирование OpenMP и, в частности, разные типы. Я понимаю общее поведение каждого типа, но уточнение было бы полезно в том, когда выбирать между dynamic
и guided
планированием.
Intel docs описывает dynamic
scheduling:
Используйте внутреннюю рабочую очередь, чтобы получить блок цикла с размером блока итераций к каждому потоку. Когда поток завершен, он извлекает следующий блок итераций цикла из верхней части рабочей очереди. От по умолчанию размер блока равен 1. Будьте осторожны при использовании этого планирования типа из-за дополнительных накладных расходов.
В нем также описывается планирование guided
:
Подобно динамическому планированию, но размер блока начинается с больших и уменьшается, чтобы лучше справляться с дисбалансом нагрузки между итерациями. Необязательный параметр chunk указывает их минимальный размер для использования. От по умолчанию размер блока приблизительно равен loop_count/number_of_threads.
Поскольку guided
планирование динамически уменьшает размер куска во время выполнения, почему я когда-либо использовал планирование dynamic
?
Я исследовал этот вопрос и нашел эту таблицу из Дартмута:
guided
указан как имеющий служебные данные high
, тогда как dynamic
имеет средние служебные данные.
Это изначально имело смысл, но при дальнейшем исследовании я читал статью Intel по этой теме. Из предыдущей таблицы я предположил, что планирование guided
займет больше времени из-за анализа и корректировки размера блока во время выполнения (даже при правильном использовании). Однако в статье Intel говорится:
Управляемые расписания работают лучше всего с небольшими размерами блоков в качестве их лимита; это дает максимальную гибкость. Неясно, почему они становятся хуже на более крупные размеры блоков, но они могут занять слишком много времени, когда они ограничены большими размеры блоков.
Почему размер блока зависит от guided
, занимающего больше, чем dynamic
? Было бы разумно, если бы отсутствовала "гибкость", чтобы вызвать потерю производительности за счет слишком большого блокирования размера куска. Однако я бы не назвал это "накладными расходами", и проблема блокировки могла бы дискредитировать предыдущую теорию.
Наконец, в статье говорится:
Динамические графики дают максимальную гибкость, но производительность при неправильном расписании.
Для планирования dynamic
имеет смысл быть более оптимальным, чем static
, но почему он более оптимален, чем guided
? Это просто накладные расходы, которые я допрашиваю?
Эта некоторая взаимосвязанная запись SO объясняет NUMA, относящуюся к типам планирования. Это не имеет отношения к этому вопросу, поскольку требуемая организация теряется в результате поведения этих типов планирования "первым пришел, первым обслужен".
dynamic
планирование может быть коалесцентивным, что приводит к повышению производительности, но тогда такая же гипотеза должна применяться к guided
.
Здесь приведены сроки каждого типа планирования для разных размеров блоков из статьи Intel для справки. Это только записи из одной программы и некоторые правила применяются по-разному для каждой программы и машины (особенно при планировании), но она должна обеспечивать общие тенденции.
EDIT (ядро моего вопроса):
- Что влияет на время выполнения
guided
планирования? Конкретные примеры? Почему в некоторых случаях это медленнее, чемdynamic
? - Когда я одобряю
guided
надdynamic
или наоборот? - Как только это объясняется, поддерживайте ли источники выше ваши объяснения? Они вообще противоречат?