Становятся ли атомарные операции медленнее по мере добавления большего количества процессоров?

StackOverflow https://stackoverflow.com/questions/1585825

Вопрос

x86 и другие архитектуры предоставляют специальные атомарные инструкции (lock, cmpxchg и т.д.), Которые позволяют вам писать структуры данных без блокировок.Но по мере добавления все большего количества ядер кажется, что работа, которую этим инструкциям на самом деле придется выполнять за кулисами, будет расти (по крайней мере, для поддержания согласованности кэша?).Если атомарная надстройка сегодня занимает ~ 100 циклов в двухъядерной системе, может ли это занять значительно больше времени на машинах будущего с более чем 80 ядрами?Если вы пишете код на last, может быть, действительно было бы лучше использовать блокировки, даже если сегодня они работают медленнее?

Это было полезно?

Решение

Вы правы в том, что ограничения топологии, так или иначе, увеличат задержку обмена данными между ядрами, как только их количество превысит пару десятков.Я действительно не знаю, каковы намерения компаний x86 в отношении такого рода масштабирования.

Но блокировки реализуются в терминах атомарных операций.Таким образом, вы на самом деле не выиграете, пытаясь переключиться на них, если только они не будут реализованы более масштабируемым способом, чем тот, который вы попытались бы использовать с помощью ваших собственных атомарных операций, выполняемых вручную.Я думаю, что, как правило, для конфликтов, подобных одиночным токенам, атомарные примитивы всегда будут самым быстрым способом, независимо от того, сколько у вас ядер.

Как давным-давно обнаружил Крэй, здесь не бывает бесплатных обедов.Высокоуровневый дизайн программного обеспечения, при котором вы стараетесь использовать потенциально спорные ресурсы как можно реже, всегда приведет к наибольшему выигрышу в приложениях с массовым распараллеливанием.Это означает выполнение как можно большего объема работы в результате получения блокировки, но и как можно быстрее.В экстремальных ситуациях это может означать предварительный расчет вашей работы в предположении об успешно полученной блокировке, попытку захватить ее и просто завершить как можно быстрее в случае успеха, в противном случае отбросить свою работу и повторить попытку в случае неудачи.

Другие советы

На вопрос, поставленный в названии, короткий ответ - "да", длинный - "это сложно".

Что касается того, что замки лучше, то нет.Внутренне блокировка должна пропускать по шине по меньшей мере столько же (если не больше) трафика.Подумайте об этом таким образом, если у процессора есть только одна атомарная операция, атомарное сравнение и подкачка, вы могли бы использовать ее для реализации блокировок и атомарных приращений.Что ж, на уровне протокола шины используется всего несколько примитивов.Блокировки не медленнее атомарных операций, потому что они делают что-то другое, они медленнее, потому что они делают больше одного и того же (с точки зрения согласованности).Таким образом, по мере замедления атомарных операций блокировки будут иметь тенденцию к сравнительному замедлению.

Сказав это, можно сказать, что существует множество работ на эту тему, и конкретные случаи являются сложными.Я бы не стал беспокоиться о том, как ваш код будет масштабироваться на 80-ядерных процессорах, которые имеют непредсказуемые характеристики производительности (потому что мы не знаем, как они будут спроектированы).Либо они будут вести себя так же, как наши текущие процессоры, и ваш код будет работать нормально, либо они не будут, и все, о чем вы догадались сейчас, окажется неправильным.В большинстве случаев окажется, что код в любом случае не был чувствителен к производительности, так что это не имеет значения, но если это так, то уместным будет исправить это в будущем, когда вы поймете архитектурные характеристики и производительность ваших целевых процессоров.

Я не думаю, что проблема в том, что атомарные операции сами по себе займут больше времени;реальная проблема может заключаться в том, что атомарная операция может блокировать операции шины на других процессорах (даже если они выполняют неатомные операции).

Если вы хотите написать код до конца, постарайтесь в первую очередь избежать блокировки.

В качестве дополнительного примечания к этому вопросу стоит упомянуть, что будущее, на которое вы ссылаетесь, - это уже существующая технология в графических процессорах.современный графический процессор quadro имеет целых 256 ядер и может выполнять атомарные операции с глобальной (дисплейной) памятью.
Я не уверен, как это достигается, но факт в том, что это уже происходит.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top