Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

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